我有一个以不同精度进行数学运算的函数,提供的类型可以是uint8_t,uint16_t或uint32_t
虽然在函数内部,但是有一个乘法可以得到比输入类型更大的结果,例如,如果输入在uint32_t中,则需要使用uint64_t进行乘法。
现在我可以为所有这些使用64b整数但是之后我还要制作该函数的SSE版本,所以我想保持类型尽可能小的练习运行太
由于函数很长,我只会使用相同问题的简短示例:
template <typename T>
uint32_t multiply_and_return_lower_value(T a, T b) {
auto big_result = static_cast<Magic>(a) * b;
return static_cast<T>(big_result);
}
因此,除了“魔术”之外,我需要获得比T大两倍的类型。
我认为这可能是在类似于std :: numeric_limits的情况下完成的,所以像
auto big_result = static_cast<my_func_that_somehow_returns_a_type<T>::get_type()>(a) * b;
但我不知道甚至google什么,因为函数实际上无法返回类型,而我依旧记得以某种方式存储和使用类型之前,我不记得涉及的任何关键字。
答案 0 :(得分:0)
“返回类型的函数”(给定另一种类型)是一个类模板(或一个中定义的 typedef-name );当以这种方式使用时,它们通常被称为“特征类”。可能没有任何东西专门用于“加倍这个尺寸”,但是制作自己的并不难:
template<class> struct width2; // undefined
template<> struct width2<uint8_t> {
using type=uint16_t;
};
// more explicit specializations...
template<class T> using width2_t=typename width2<T>::type; // for convenience
// Usage:
auto big_result = static_cast<width2_t<T>>(a) * b;
答案 1 :(得分:0)
只需使用专门的模板实现映射。
template<typename int_t> struct int_squared;
template<>
struct int_squared<uint8_t> {
typedef uint16_t type;
};
template<typename T>
using int_squared_t=typename int_squared<T>::type;
使用该模板int_squared_t<T>
,模板参数T
为uint8_t
会产生uint16_t
,此处为此。
为uint16_t
和uint32_t
添加明显的专精,您就完成了。