我想在我的函数中使用initializer_list作为参数,以便使用未确定数量的特定类型的变量。它必须是initializer_list,因为我希望能够在函数调用上创建列表,因为我将列表传递给其他子函数。但是,我需要能够修改列表中的元素,因为initializer_list自动生成类型为const的指针。
所以我的问题是如何创建自己的initializer_list类?使用const删除标题的副本并不起作用,我似乎无法在任何地方找到答案。
答案 0 :(得分:3)
你不能。 std::initializer_list
是一种与编译器错综复杂的神奇类型,并且无法创建自己的类型,具有从braced-init-list构造的相同能力。
从这个意义上来说,它有点像std::typeinfo
和std::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>
作为函数参数,然后(有足够多种隐式构造函数)在那里传递任何连续的容器,包括array
,vector
和initializer_list
。完全支持移动。
希望这有帮助。