【发布时间】:2014-10-01 20:38:03
【问题描述】:
我有一个依赖于整数模板参数的类。在我的程序中,我想使用此模板的一个实例化,具体取决于在运行时确定的此参数的值。这是一个简单的示例,演示了我目前如何使用大 switch 语句来解决这个问题:
#include <string>
#include <iostream>
#include <type_traits>
template<unsigned A>
struct Wrapper {
typedef typename std::conditional<A==1, int, float>::type DataType;
DataType content[A];
void foo() {
std::cout << A << std::endl;
};
};
int main(int argc, char *argv[])
{
std::string arg = argv[1];
int arg_int = std::stoi(arg);
switch (arg_int) {
case 1: {
Wrapper<1> w;
w.foo();
break;
}
case 2: {
Wrapper<2> w;
w.foo();
break;
}
case 3: {
Wrapper<3> w;
w.foo();
break;
}
default:
return 1;
};
return 0;
}
一旦我不仅有一个参数A,而且有多个不同组合的模板参数,这很快就会变得笨拙。我们还假设实际上有一个很好的理由将 A 实现为模板参数。
有没有办法用几乎相同的 case 语句替换巨大的 switch 语句,例如使用一些来自 Boost 或预处理器的元编程魔法?
理想情况下,我希望能够编写如下内容:
INSTANTIATE_DEPENDING(i, {1, 2, 3},
{
Wrapper<i> w;
w.foo();
}
);
【问题讨论】:
-
看起来像是使用虚拟继承来解决的任务,或者,如果整数真的只是代表数组的大小,那么使用
std::vector。 -
我会为这些参数创建一个单独的结构来对它们进行分组并将其用作模板参数
-
模板类确实比简单的例子复杂。无法避免使用不同的模板实例化,我在示例中添加了一些额外的复杂性。
-
交换机使用的有效数字有什么限制?
-
在这种情况下,有效数字是
{1, 2, 3}。它可能是不同的集合。不过,我也许可以安排它们总是升序的自然数。
标签: c++ templates boost c-preprocessor