c++ - 在运行时生成可变参数列表

标签 c++ c++11 templates c++14 variadic-templates

假设我想处理 N_DIMS 维度的正方形网格,每个 N_RES 元素长度,结果为 N_ELEMS = std::pow( N_RES, N_DIMS) 个元素。

我必须遵循的实现是对非方形网格的概括

template<typename T, size_t... DIMS>
class MeshGrid
{
   // ... etc etc
}

比如一个可能的实例有 3 个维度,分别有 4、5、6 个元素

 MeshGrid<float, 4, 5, 6> mg; // call A

现在我喜欢把它改编成类似的东西

template<typename T, size_t RES, size_t... DIMS>
class MeshSquare
{
   // ... etc etc
}

保留 MeshGrid 内部 DIMS 逻辑,以便执行运行时调用,例如 B

int res = 4, dims = 2
MeshSquare<float, res, ??dims??> // call B

对于 2 维正方形网格示例,每个 4 个元素 = 总共 16 个元素。

老实说,我对自己想做的事情持怀疑态度;我觉得可变参数列表必须在编译时处理;上面的 B 调用是胡说八道。

如果可能的话,我的问题是如何扩展 dims 以适应 B 调用。

最佳答案

如果你需要在dims上模板化MeshSquare,那么你唯一能做的就是提前生成所有的实例化,然后switch 在运行时。例如

switch(dims)
{
    case 0: foo<MeshSquare<float, res, 0>>(); break;
    case 1: foo<MeshSquare<float, res, 0, 1>>(); break;
    case 2: foo<MeshSquare<float, res, 0, 1, 2>>(); break;
    case 3: foo<MeshSquare<float, res, 0, 1, 2, 3>>(); break;
    case 4: foo<MeshSquare<float, res, 0, 1, 2, 3, 4>>(); break;
    // ...
}

您可以使用 C++17 折叠表达式、编译时递归和 index_sequence 以及许多其他技术轻松生成此类开关。或者,考虑使用充当运行时和编译时世界之间桥梁的库,例如 petra (C++17)。


更合适的解决方案可能只是不将维度存储为模板参数,而是使用更动态(运行时)的数据结构。

关于c++ - 在运行时生成可变参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50046686/

相关文章:

c++ - C++ 中的运算符 (::Type*)0 是什么意思

c++ - C++11中通过pthreads获取线程Core affinity

c++ - 使用特征参数进行模板推导

c++ - 模板静态成员定义取决于传递给链接器的顺序

c++ - GUI 和文本模式 C++ 设计以消除冗余(可选参数?函数重载?)

c++ - 通过 std::regex 从数学表达式制作树

c++ - 返工 make 文件以将 obj 放入不同的位置

c++ - 如何在作为 map 键的 vector 的 2 个数组中搜索公共(public)元素?

c++ - vector push_back 与转发?

c++ - 清除任意二维数组