非constexpr将字符转换为类型

时间:2016-11-25 16:52:59

标签: c++ templates traits

我想知道我在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,因此没有多大意义。

我很感激一些提示

2 个答案:

答案 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;
}

这为编译器提供了更多优化此选择的空间 ....