gpt4 book ai didi

c++ - 如何初始化一系列不可移动、不可复制的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:16 29 4
gpt4 key购买 nike

假设我有一个既不可移动也不可复制的类型:

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] , 一个 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();

如果这看起来很麻烦,那确实是。但是您可以轻松地将那个功能封装在一个类中。

关于c++ - 如何初始化一系列不可移动、不可复制的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962491/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com