假设我要处理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 调用。 最佳答案
如果您需要在MeshSquare
上对dims
进行模板化,那么您唯一可以做的就是提前生成所有实例化,然后在运行时生成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)。一个更合适的解决方案可能只是不将维度存储为模板参数,而是使用更具动态性(运行时)的数据结构。