2014-12-05 255 views
1

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

例如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} 

我不想在模板<中添加特定类型>。结构A < 64,64>应该不变。

+0

C++没有泛型,它有模板,它们不是相同的东西,甚至没有类似的东西。 – EJP 2014-12-05 23:22:29

回答

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 ::有条件的两种类型之间进行选择。

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

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. 
+0

这是我正在寻找。感谢朋友。 – TreeOfLife 2014-12-05 23:13:39

+0

不客气的人clearcase正在浪费我的时间today.I很乐意帮助 – West 2014-12-05 23:17:24

+0

只是最后一个问题,如果我想在这里使用第三个变量,让我们只是说一个int_32作为例子,我将如何需要改变这一点。 std:条件似乎只适用于真/假状态。 – TreeOfLife 2014-12-05 23:23:01

0

您可以使用预处理器命令来参数化int_之后的位数,但这是不好的编程。

#define TYPE(bits) int_##bits 

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

相关问题