我想知道我在C++
假设我有一个模板
template<typename T>
struct Foo {
static void foo();
};
和非constexpr char c
。
现在,我想创建一个Foo
的实例,并根据我的角色的值做一些事情:
if (c == 'i')
Foo<int>::foo();
else if (c == 'f')
Foo<float>::foo();
....
有更优雅的方式吗?我在考虑写一个char trait
,就像这样:
template<char c>
struct char_trait {};
template<>
struct char_trait<'i'> {
using type = int;
};
但是,由于c
是非constexpr,因此没有多大意义。
我很感激一些提示
答案 0 :(得分:5)
如the comment中所述,模板(特征)版本不适用于运行时评估。
你可以做些什么来避免长if() {} else if()
级联是在地图中组织你的东西:
std::map<char,std::function<void ()>> foo_calls {
{ 'i', Foo<int>::foo } ,
{ 'f', Foo<float>::foo } ,
// ...
};
并使用
auto it = foo_calls.find(c);
if(it != foo_calls.end) {
(it->second)();
}
答案 1 :(得分:1)
这是不可能的。 C ++中的所有模板实例都在编译时完成。这是好事还是坏事。无法在运行时实例化模板。
虽然有很多不同的方法可以将变量的值转换为正确的函数调用。例如,您可以尝试:
switch (c)
{
case 'i':
Foo<int>::foo(); break;
case 'f':
Foo<float>::foo(); break;
}
这为编译器提供了更多优化此选择的空间 ....