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

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

我正在尝试实现 reshape fortran 与 C++(11/14) 的函数,我设计了一个函数。此函数接受两个 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 , 然而来自 static-assert-on-initializer-listsize我知道这是行不通的。环顾四周,我发现 how-to-cause-a-compile-time-error-based-on-the-size-of-an-initializer-list但这对我的情况没有帮助。 我认为编译器可以获得足够的信息并推断出 int D 的值automatically,但我不知道如何。使用 std::initializer_list 可能不是个好主意?我在这里完全迷路了

最佳答案

Maybe its a bad idea to use 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...
}

关于c++ - 在编译时获取 `std::initializer_list` 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41311023/

相关文章:

c++ - C++中原子变量的线程安全初始化

templates - 如何使用 Kubernetes yaml 文件设置动态值

C++获取构造函数的类型

c++ - 复制赋值运算符应该作为一般规则利用 std::swap 吗?

c++ - 在模板化容器成员上调用类函数

c++ - switch 语句多字符常量

c++ - 为什么基于范围的 for 循环会使我的 C++ 程序崩溃?

c++ - OpenCV 3:如何将 cv::Mat 作为可选参数传递

c++ - 将数字格式化为小数点后 n 位,而不进行四舍五入

c++通过csv文件和最后一列进行解析