c ++中的模板类型成员变量

时间:2014-12-05 22:47:21

标签: c++ templates

我试图根据我模板中写的内容来更改成员变量的类型。

例如A<64, 64>应该使我的成员为int_128 遗憾的是,我不知道如何使用模板类型,我发现的每个教程只对模板函数有帮助。

我的班级看起来像

template<int x, int y>
class A{

    private:
    TYPETOBEGENERIC m_variable
}

有没有办法在构造函数中执行此操作,如

if( x+y <= 64){ TYPETOBEGENERIC = int_64 }
    else{TYPETOBEGENERIC = int_128}

我不想在模板&lt;&gt;中添加特定类型。结构A&lt; 64,64&gt;应该不受影响。

2 个答案:

答案 0 :(得分:4)

constexpr bool lessThan64(int a,int b) {
    return (a+b) < 64;
} 
template<int x, int y>
class A{
    using type = typename std::conditional<lessThan64(x,y),int_64,int_128>::type;
    private:
    type m_variable;
}

使用constexpr函数来获取编译时元编程,我们可以在编译时评估这些值,然后使用std :: conditional在两种类型之间进行选择。

编辑: 对于两种以上的类型,您可以使用可变参数模板或显式特化。

template<unsigned int I,typename... Sizes>
struct select;

template<unsigned int I,typename T,typename... Sizes>
struct select<I,T,Sizes...>:select<N-1,Cases...>
{
}    

template<unsigned int I,typename T,typename... Sizes>
struct select<O,T,Sizes...>
{
    using type =T
}

You would obviously need a constexpr function to differentiate between the types.

答案 1 :(得分:0)

您可以使用预处理器命令来参数化int_后的位数,但编程错误。

#define TYPE(bits) int_##bits

现在声明一个32位整数(假设存在这样的类型),你写TYPE(32) my_var;。可能有更好的方法可以做任何你想做的事情。