如何在模板化函数中获取两倍于指定类型的类型?

时间:2017-09-24 02:06:40

标签: c++

我有一个以不同精度进行数学运算的函数,提供的类型可以是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什么,因为函数实际上无法返回类型,而我依旧记得以某种方式存储和使用类型之前,我不记得涉及的任何关键字。

2 个答案:

答案 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>,模板参数Tuint8_t会产生uint16_t,此处为此。

uint16_tuint32_t添加明显的专精,您就完成了。