initializer_list 类

C++语言 码拜 9年前 (2016-04-18) 938次浏览
代码 initializer_list<int> a = { 10, 11, 12 }; 可以编译通过。
本人想 怎么样本人实现 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的构造函数。

20

有一些东西是编译器作弊的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明initializer_list 类
喜欢 (0)
[1034331897@qq.com]
分享 (0)