我试图编写一个包含变量的类,该变量的类型将被选择为能够包含值的最小值。
我的意思是:
class foo {
"int type here" a;
}
我遇到了Automatically pick a variable type big enough to hold a specified number。 由于使用boost库的困难,我继续使用模板建议。
将代码转换为:
template<unsigned long long T>
class foo {
SelectInteger<T>::type a;
}
但是,我的问题来自于变量的大小是浮点变量和整数相乘的结果。因此,我希望能够做到的是:
template<unsigned long long T, double E>
class foo {
SelectInteger<T*E>::type a;
}
但由于模板不能使用浮点变量(请参阅here),因此我无法在模板中传递E
。是否有其他方法可以将变量(在编译期间应该可用)传递给类?
答案 0 :(得分:8)
使用constexpr
函数怎么样?
我的意思是......如下所示
template <unsigned long long>
struct SelectInteger
{ using type = int; };
template <>
struct SelectInteger<0U>
{ using type = short; };
constexpr unsigned long long getSize (unsigned long long ull, double d)
{ return ull*d; }
template <unsigned long long T>
struct foo
{ typename SelectInteger<T>::type a; };
int main()
{
static_assert( std::is_same<short,
decltype(foo<getSize(1ULL, 0.0)>::a)>::value, "!");
static_assert( std::is_same<int,
decltype(foo<getSize(1ULL, 1.0)>::a)>::value, "!!");
}