当前位置:  编程技术>c/c++/嵌入式
本页文章导读:
    ▪union(联合)        union 维护足够的空间来置放多个数据成员中的"一种"而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相.........
    ▪C++事件机制实现的改进      才想起来像这样“return void();”也是合法的,所以这次给事件加上返回值支持,而且之前事件声明语法很难看:1 Event(int, int) event;改成大众喜闻乐见的样子:1 Event<void (int, int)> event;.........
    ▪C++11学习笔记(1)--- Range-based for loop      郑重声明:本文是笔者根据个人理解所写,错误难免,欢迎拍砖!       可以任意转载、修改,转载时是否标明出处,随君而定!  range-for是C++ 11新增特性,用于循环迭代一个&l.........

[1]union(联合)
    来源:    发布时间: 2013-10-17

  union 维护足够的空间来置放多个数据成员中的"一种"而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址,union 主要用来压缩空间,如果一些数据不可能在同一时间同时被用到,则可以使用union。

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,例如下面的StateMachine 的空间大小就是double 数据类型的大小

1 union StateMachine
2 {
3 char character;
4 int number;
5 char *str;
6 double exp;
7 };

 

本文链接


    
[2]C++事件机制实现的改进
    来源:    发布时间: 2013-10-17

才想起来像这样“return void();”也是合法的,所以这次给事件加上返回值支持,而且之前事件声明语法很难看:

1 Event(int, int) event;

改成大众喜闻乐见的样子:

1 Event<void (int, int)> event;

不过需要自己实现的代码就增多不少,已经不能称之为简洁了。首先考虑返回值怎么表示,可以这样:

1 template<class P1>
2 auto operator ()(P1 arg1) -> decltype(std::function<HandlerT>(arg1))
3 {
4 int j = m_handlers.size();
5
6 for ( const auto& i : m_handlers )
7 {
8 if ( --j == 0 )
9 return i.second(arg1);
10 else
11 i.second(arg1);
12 }
13
14 return decltype(std::function<HandlerT>(arg1))();
15 }

但是看起来很繁琐,用类型萃取把返回值类型取出来,还可以顺便把参数个数、每个参数的类型提取,这对扩展很有用(现在只用到返回值类型和参数个数):

1 // 萃取函数签名里的参数个数和返回值类型
2 template<class R> struct ParamTraits { typedef void RetType; };
3 template<class R> struct ParamTraits<R ()> { enum { num = 0 }; typedef R RetType; };
4 template<class R, class P1> struct ParamTraits<R (P1)> { enum { num = 1 }; typedef R RetType; };
5 template<class R, class P1, class P2> struct ParamTraits<R (P1, P2)> { enum { num = 2 }; typedef R RetType; };
6 template<class R, class P1, class P2, class P3> struct ParamTraits<R (P1, P2, P3)> { enum { num = 3 }; typedef R RetType; };
7 template<class R, class P1, class P2, class P3, class P4> struct ParamTraits<R (P1, P2, P3, P4)> { enum { num = 4 }; typedef R RetType; };
8 template<class R, class P1, class P2, class P3, class P4, class P5> struct ParamTraits<R (P1, P2, P3, P4, P5)> { enum { num = 5 }; typedef R RetType; };
9 template<class R, class P1, class P2, class P3, class P4, class P5, class P6> struct ParamTraits<R (P1, P2, P3, P4, P5, P6)> { enum { num = 6 }; typedef R RetType; };
10 template<class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7> struct ParamTraits<R (P1, P2, P3, P4, P5, P6, P7)> { enum { num = 7 }; typedef R RetType; };
11 template<class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> struct ParamTraits<R (P1, P2, P3, P4, P5, P6, P7, P8)> { enum { num = 8 }; typedef R RetType; };
12 template<class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> struct ParamTraits<R (P1, P2, P3, P4, P5, P6, P7, P8, P9)> { enum { num = 9 }; typedef R RetType; };
13 template<class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class P10> struct ParamTraits<R (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10)> { enum { num = 10 }; typedef R RetType; }
    
[3]C++11学习笔记(1)--- Range-based for loop
    来源:    发布时间: 2013-10-17

郑重声明:本文是笔者根据个人理解所写,错误难免,欢迎拍砖!

       可以任意转载、修改,转载时是否标明出处,随君而定!

  range-for是C++ 11新增特性,用于循环迭代一个“范围”,该“范围”类似于包含有begin()和end()方法的STL序列容器。所有的STL标准容器都适用于该“范围”,例如vector、string等等。数组也同样可以,只要定义了begin()和end()方法的任何“范围”都可以使用for来循环迭代容器里面的元素,如istream。

语法:

for ( range_declaration : range_expression) loop_statement

上述代码的效果类似于:

(__range, __begin and __end are for exposition only): 
{
auto && __range = range_expression ;

for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin)
{
range_declaration = *__begin;
     loop_statement
}

}

range_expression被用于确定将要迭代的序列或范围。序列中的每个元素被解引用,并赋值给由range_declaration指定的变量。

迭代器begin_expr和end_expr可以被定义成如下类型:

* 如果__range是数组,(__range) 和 (__range + __bound)表示数组的范围

*如果__range是一个类,实现了begin()或end()方法,或者两个方法都实现了,此时begin_expr就表示 __range.begin(),而 end_expr则表示 __range.end()。

否则begin(__range)和end(__range)将通过基于与std名称空间关联的参数依赖查找规则来查找。

如果range_expression返回一个临时变量,它的生命周期到循环结束,如绑定到右值__range的,但要注意,临时嵌套在range_expression中的并没有延长其生命周期。

如同传统的for语句,关键字break可以提前结束循环,而continue可以继续循环。

example:

1 void f(vector<double>& v)
2 {
3 for (auto x : v) cout << x << '\n';
4 for (auto& x : v) ++x; // 通过引用可以修改v中的值
5 }

for也可以用于迭代普通的数组,如:

for (const auto x : { 1,2,3,5,8,13,21,34 }) cout << x << '\n';

误区一:

1 int* p = new int [2];
2 p[0] = 1;
3 p[1] = 2;
4 for (auto x : p) cout << x << endl;

编译器会报错误:

错误:对‘begin(int*&)’的调用没有匹配的函数

通过上面对for的介绍可以知道,for实现的机制就是依赖与容器中的begin()和end()方法。对于普通的数组,编译器默认已经实现了类似的方法。这里的p是一个指针,尽管它可以像数组一样使用,但是它并没有类似与begin()或end()的方法,当然会编译不通过。

 

参考文献:

http://www.stroustrup.com/C++11FAQ.html

http://en.cppreference.com/w/cpp/language/range-for

本文链接


    
最新技术文章:
▪C++单例模式应用实例
▪C++设计模式之迭代器模式
▪C++实现动态分配const对象实例
▪C++设计模式之中介者模式
▪C++设计模式之备忘录模式
▪C++插入排序算法实例
▪C++冒泡排序算法实例
▪C++选择排序算法实例
▪C++归并排序算法实例
▪C++设计模式之观察者模式
▪C++中复制构造函数和重载赋值操作符总结
▪C++设计模式之状态模式
▪C++设计模式之策略模式
▪C++设计模式之访问者模式
▪C++设计模式之模板方法模式
▪C++实现下载的代码
▪C++模板之特化与偏特化详解
▪C++实现查壳程序代码实例
▪C语言、C++内存对齐问题详解
▪C语言、C++中的union用法总结
▪C++基于CreateToolhelp32Snapshot获取系统进程实例
▪C++中memcpy和memmove的区别总结
▪C++通过TerminateProess结束进程实例
▪C++内存查找实例
▪C++实现CreatThread函数主线程与工作线程交互的...
▪C++设计模式之桥接模式
▪C++中关键字Struct和Class的区别
jquery iis7站长之家
▪C++ COM编程之什么是组件?
▪C++ COM编程之什么是接口?
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3