代码 initializer_list<int> a = { 10, 11, 12 }; 可以编译通过。
本人想 怎么样本人实现 CMyClass<int> a = { 10, 11, 12 }; 也可以编译通过。
参考了 initializer_list的实现,拷贝代码 CMyClass却没法实现这样的语句: CMyClass<int> a = { 10, 11, 12 };
initializer_list的代码如下:
本人想 怎么样本人实现 CMyClass<int> a = { 10, 11, 12 }; 也可以编译通过。
参考了 initializer_list的实现,拷贝代码 CMyClass却没法实现这样的语句: CMyClass<int> a = { 10, 11, 12 };
initializer_list的代码如下:
#pragma once #ifndef _INITIALIZER_LIST_ #define _INITIALIZER_LIST_ #ifndef RC_INVOKED #include <cstddef> #pragma pack(push,_CRT_PACKING) #pragma warning(push,3) #pragma push_macro("new") #undef new _STD_BEGIN // TEMPLATE CLASS initializer_list template<class _Elem> class initializer_list { // list of pointers to elements public: typedef _Elem value_type; typedef const _Elem& reference; typedef const _Elem& const_reference; typedef size_t size_type; typedef const _Elem* iterator; typedef const _Elem* const_iterator; initializer_list() _NOEXCEPT : _First(0), _Last(0) { // empty list } initializer_list(const _Elem *_First_arg, const _Elem *_Last_arg) _NOEXCEPT : _First(_First_arg), _Last(_Last_arg) { // construct with pointers } const _Elem *begin() const _NOEXCEPT { // get beginning of list return (_First); } const _Elem *end() const _NOEXCEPT { // get end of list return (_Last); } size_t size() const _NOEXCEPT { // get length of list return ((size_t)(_Last - _First)); } private: const _Elem *_First; const _Elem *_Last; }; // TEMPLATE FUNCTION begin template<class _Elem> inline const _Elem *begin(initializer_list<_Elem> _Ilist) _NOEXCEPT { // get beginning of sequence return (_Ilist.begin()); } // TEMPLATE FUNCTION end template<class _Elem> inline const _Elem *end(initializer_list<_Elem> _Ilist) _NOEXCEPT { // get end of sequence return (_Ilist.end()); } _STD_END #pragma pop_macro("new") #pragma warning(pop) #pragma pack(pop) #endif /* RC_INVOKED */ #endif /* _INITIALIZER_LIST_ */
这个是vs2013 initializer_list类的实现代码
本人的类
template<class _Elem> class CMyClass { // list of pointers to elements public: typedef _Elem value_type; typedef const _Elem& reference; typedef const _Elem& const_reference; typedef size_t size_type; typedef const _Elem* iterator; typedef const _Elem* const_iterator; CMyClass() _NOEXCEPT : _First(0), _Last(0) { // empty list } CMyClass(const _Elem *_First_arg, const _Elem *_Last_arg) _NOEXCEPT : _First(_First_arg), _Last(_Last_arg) { // construct with pointers } const _Elem *begin() const _NOEXCEPT { // get beginning of list return (_First); } const _Elem *end() const _NOEXCEPT { // get end of list return (_Last); } size_t size() const _NOEXCEPT { // get length of list return ((size_t)(_Last - _First)); } private: const _Elem *_First; const _Elem *_Last; }; // TEMPLATE FUNCTION begin template<class _Elem> inline const _Elem *begin(CMyClass<_Elem> _Ilist) _NOEXCEPT { // get beginning of sequence return (_Ilist.begin()); } // TEMPLATE FUNCTION end template<class _Elem> inline const _Elem *end(CMyClass<_Elem> _Ilist) _NOEXCEPT { // get end of sequence return (_Ilist.end()); }
相同的代码无法实现相同的功能,不知为何。
解决方案
20
1。initializer_list是标准要求编译器支持的功能。而initializer_list在库文件中仅仅提供解析initializer_list的实现部分。和普通的类不同,initializer_list是编译器内置的。
例如常用的有这么几个符号是编译器内置的(不完全,仅列一部分):
__VAR_ARGS__
dynamic_cast
typeid
nullptr_t
initializer_list
…
2。假如想本人的类提供初始化列表的功能,可以加入一个参数是initializer_list的构造函数。
例如常用的有这么几个符号是编译器内置的(不完全,仅列一部分):
__VAR_ARGS__
dynamic_cast
typeid
nullptr_t
initializer_list
…
2。假如想本人的类提供初始化列表的功能,可以加入一个参数是initializer_list的构造函数。
20
有一些东西是编译器作弊的。