假设我有一个既不可移动也不可复制的类型:
struct foo
{
explicit foo( size_t ){}
~foo(){}
foo( foo const & ) = delete;
foo( foo && ) = delete;
foo& operator=( foo const & ) = delete;
foo& operator=( foo & ) = delete;
};
现在给定一个在编译时已知的数字(称为 N),有没有什么方法可以在堆栈上创建这些数字的“序列”,每个序列都用数字 0 到 N-1 进行初始化?我对 C 风格的数组感到满意foo[N]
, a std::array< foo, N >
,或者甚至可能是std::tuple
某种。
我试图避免的是写出:
foo f0( 0 ), f1( 1 ), ... fNminus1( N-1 );
当我感觉这是编译器应该能够为我做的事情时。我能想到的最好的办法就是使用boost::optional
.
boost::optional< foo > f[N];
for( size_t i = 0U; i < N; ++i )
f[i] = boost::in_place( i );
但这依赖于运行时逻辑,即使所有必需的信息在编译时都可用。另外,我留下了一些行为类似于指针数组的东西。
// create a type with the proper alignment
typedef std::aligned_storage<sizeof(foo), std::alignment_of<foo>::value>::type buffer_type;
const int N = 10;
// create an array of uninitialized raw data
buffer_type storage_buffer[N];
// initialize each foo object with placement new
for (size_t i=0; i<N; ++i)
new (storage_buffer + i) foo(i);
foo * fp = (foo*)(&storage_buffer);
// access your foo objects via fp
// you must manually call the destructor of each object
for (size_t i=0; i<N; ++i)
fp[i].~foo();
如果这看起来很麻烦,确实如此。但是您可以轻松地将该功能封装在一个类中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)