gpt4 book ai didi

c++ - 对相邻元素使用新的非数组放置是否会创建数组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:09 24 4
gpt4 key购买 nike

我想创建一个模板函数,它可以初始化(使用 new 放置)一个数组,其中对于每个元素,调用一个 lambda 来初始化它。

template <typename OBJECT, typename LAMBDA>
void initialize(void *storage, int size, LAMBDA lambda) {
for (int i=0; i<size; i++) {
lambda(static_cast<char*>(storage)+i*sizeof(OBJECT), i);
}
}

实际的 lambda 可能是这样的(例如,一个整数数组,其中每个元素都被初始化为其索引):

[](void *storage, int index){ new(storage) int(index); }

这行得通。然而,正如我所见,它并没有创建一个实际的数组,因为我没有使用 placement-new-array,而是为每个元素单独调用 placement-new,即使内存布局应该是相同的。我对吗?我可以将此内存称为数组吗? 如果不能,能否以某种方式实现此功能?

(基本上,这个功能是相同的,如果 std::vector 有一个数组生成器 push_array_back 函数,它有一个 sizelambda 参数。它会push_back size 的元素,初始化为 lambda 给出的值)

最佳答案

Am I right? Can I refer to this memory as an array? If not, can this functionality be achieved somehow?

这基本上与 std::vectordata() 存在的基本问题相同,并在 CWG 2182 中指出。 .将此内存作为数组引用是未定义的行为,但实际上它需要工作,因为有太多代码依赖于它的工作。没有办法实现它。


侧节点,不要调用你的可调用对象 lambda。它们不必是 la​​mbda。并让语言帮助您进行指针偏移:

auto p = static_cast<Object*>(storage);
for (int i = 0; i < size; ++i) {
construct(static_cast<void*>(p + i), i);
}

关于c++ - 对相邻元素使用新的非数组放置是否会创建数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47650686/

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