我试图根据我模板中写的内容来更改成员变量的类型。
例如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;应该不受影响。
答案 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;
。可能有更好的方法可以做任何你想做的事情。