非const元素initializer_list类

时间:2015-11-14 15:44:47

标签: c++ initializer-list

我想在我的函数中使用initializer_list作为参数,以便使用未确定数量的特定类型的变量。它必须是initializer_list,因为我希望能够在函数调用上创建列表,因为我将列表传递给其他子函数。但是,我需要能够修改列表中的元素,因为initializer_list自动生成类型为const的指针。

所以我的问题是如何创建自己的initializer_list类?使用const删除标题的副本并不起作用,我似乎无法在任何地方找到答案。

3 个答案:

答案 0 :(得分:3)

你不能。 std::initializer_list是一种与编译器错综复杂的神奇类型,并且无法创建自己的类型,具有从braced-init-list构造的相同能力。

从这个意义上来说,它有点像std::typeinfostd::nullptr_t。它们恰好在命名空间std中定义,因此看起来是标准库的一部分,但它们实际上是预定义类型,它们是运行时环境的一部分,无法在纯C ++中进行模拟。

答案 1 :(得分:3)

我认为你可以使用矢量。

void foo(std::vector<int> values);

可以用

调用
foo({ 1, 2, 3, 4 });

然后你可以照常传递(移动)矢量,当然元素是可修改的。

答案 2 :(得分:0)

你不能直接这样做。但是,我之前在代码中做了一些解决方法。 首先,slice类型是一个围绕连续内存块的非拥有包装器 - 指向其开始及其大小的指针。 其次,我添加了以下ctor:

slice(std::initializer_list<T> && list)
    : slice((T*)list.begin(), list.size())
{ }

其中T是切片的类型。这在G ++ 4.8和4.9上运行良好,但我没有在5.X版本上检查它。

这绝对是一个hack,但你可以使用slice<T>作为函数参数,然后(有足够多种隐式构造函数)在那里传递任何连续的容器,包括arrayvectorinitializer_list。完全支持移动。

希望这有帮助。