在编译时获取`std :: initializer_list`的大小

时间:2016-12-24 06:44:46

标签: c++ c++11 templates initializer-list

我正在尝试使用C ++(11/14)实现fortran的std::initializer_list函数,并设计了一个函数。此函数接受两个initializer_list。第一个D给出了我用来初始化initializer_list维数组的初始值。第二个template<int D, typename T> auto forreshape(const std::initializer_list<T> & values, const std::initializer_list<int> & shape) { // some irrelevant codes to calculate lbound return for1array_gen<T, D>(lbound, shape, values); // returns D dimension array fornarray<T, D> } int main(){ auto reshaped_array = forreshape<2>({1, 2, 3, 4, 5, 6}, {2, 3}); } 给出了数组每个维度的大小。 我写了这样的草稿

int D

此实现需要给定非类型模板参数D,但我想要一些没有forreshape({1, 2, 3, 4, 5, 6}, {2, 3});的内容,例如std::initializer_list<T>::size。 起初我想使用int D,但是从static-assert-on-initializer-listsize我知道它不起作用。环顾四周,我找到how-to-cause-a-compile-time-error-based-on-the-size-of-an-initializer-list,但这对我的情况没有帮助。 我认为编译器可以获得足够的信息并自动推导出std::initializer_list的值,但我不知道如何。使用Intent可能是个坏主意吗?我完全迷失在这里

1 个答案:

答案 0 :(得分:3)

  

使用std::initializer_list可能是个坏主意吗?

我是这么认为的。考虑

std::initializer_list<int> t;
std::initializer_list<int> a = {1,2,3};
std::initializer_list<int> b = {2,3};
if (rand() > 42)
    t = a;
else
    t = b;
auto reshaped_array = forreshape({1,2,3,4,5,6}, t);

在上面的示例中,在编译时无法知道t.size()

但是你可以要求编译器通过使用对C风格数组的引用来推断初始化列表的长度,这要归功于CWG 1591

forreshape的定义如下:

template<int D, typename T>
auto forreshape(const std::initializer_list<T> & values, const int (&shape)[D])
{
    // use D...
}