C++ 如何在模板化函数中获得一个大小为指定类型两倍的类型?

C++ 如何在模板化函数中获得一个大小为指定类型两倍的类型?,c++,C++,我有一个函数,它以不同的精度进行计算,提供的类型可以是uint8\u t、uint16\u t或uint32\u t 然而,在函数内部,存在一个乘法,其结果可能大于输入类型所能容纳的结果,因此,例如,如果输入在uint32_t中,则需要使用uint64_t进行乘法 现在我可以对所有的函数使用一个64b的整数,但是在那之后,我还将制作一个SSE版本的函数,所以我希望在实际运行时尽量保持类型小 由于函数很长,我将使用同一问题的一个简短示例: template <typename T> u

我有一个函数,它以不同的精度进行计算,提供的类型可以是uint8\u t、uint16\u t或uint32\u 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);
}
模板
uint32乘以和返回较低的值(TA,TB){
自动放大结果=静态放大(a)*b;
返回静态施法(大施法结果);
}
所以我需要得到两倍于T的类型来代替“魔法”

我认为这可能以类似于std::numeric_limits的方式实现

auto big_result = static_cast<my_func_that_somehow_returns_a_type<T>::get_type()>(a) * b;
auto big\u result=static\u cast(a)*b;
但我甚至不知道该用谷歌搜索什么,因为函数实际上不能返回类型,虽然我模糊地记得以前以某种方式存储和使用过类型,但我不记得任何涉及的关键字。

一个“返回类型的函数”(给定另一种类型)是一个类模板(或其中定义的typedef名称);当这样使用时,它们通常被称为“特质类”。可能没有任何东西专门用于“双倍于此尺寸”,但制作自己的也不难:

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;
模板结构宽度2;//未定义
模板结构宽度2{
使用类型=uint16\u t;
};
//更明确的专业化。。。
使用宽度2的模板\u t=typename宽度2::type;//为了方便
//用法:
自动放大结果=静态放大(a)*b;
一个“返回类型的函数”(给定另一个类型)是一个类模板(或其中定义的typedef名称);当这样使用时,它们通常被称为“特质类”。可能没有任何东西专门用于“双倍于此尺寸”,但制作自己的也不难:

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;
模板结构宽度2;//未定义
模板结构宽度2{
使用类型=uint16\u t;
};
//更明确的专业化。。。
使用宽度2的模板\u t=typename宽度2::type;//为了方便
//用法:
自动放大结果=静态放大(a)*b;

只需使用专用模板实现映射即可

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;
template struct int_squared;
模板
结构整数平方{
typedef uint16_t type;
};
模板
使用int_squared_t=typename int_squared::type;
这样,模板中的
int\u squared\u t
,模板参数
t
uint8\u t
将导致
uint16\u t


uint16\u t
uint32\u t
添加明显的专门化,就完成了。

只需使用专门化模板实现映射

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;
template struct int_squared;
模板
结构整数平方{
typedef uint16_t type;
};
模板
使用int_squared_t=typename int_squared::type;
这样,模板中的
int\u squared\u t
,模板参数
t
uint8\u t
将导致
uint16\u t


uint16\u t
uint32\u t
添加明显的专门化,您就完成了。

t[2]
正好是两倍大。
t[2]
正好是两倍大。