gpt4 book ai didi

c++ - 将 C++ 整数类型模板参数转换为 "longer"整数类型

转载 作者:行者123 更新时间:2023-11-30 01:03:12 26 4
gpt4 key购买 nike

我有一个接受整数类型并对两个输入参数执行数学运算的模板函数:

template<typename T, typename R>
R multiply( const T& lhs, const T& rhs ) {
R ans = static_cast<R>( lhs ) * static_cast<R>( rhs );
return ans;
}

(为简单起见,假设类型 T 和 R 始终是无符号整数类型,或者我执行适当的检查以确保。)

在这个人为设计的示例中,您可以看到我正在做一个简单的乘法(仅供说明)。这个想法是传递一个类型 R,它的位数是类型 T 的两倍;这将允许完整的产品适合返回值:

uint64_t Product64 = multiply<uint32_t,uint64_t>( 0xFFFFFFFF, 0xFFFFFFFF );
uint16_t Product16 = multiply<uint8_t,uint16_t>( 0xFF, 0xFF );

我想知道是否有任何方法免除第二个模板参数,并自动计算一个类型[至少] 在编译时的位宽是类型 T 的两倍。

注意:始终对 R 使用最大可用整数类型 (uint64_t) 对我来说不是解决方案。理想情况下,我想要一个编译时计算的类型,它刚好足够以容纳两倍于类型 T 的位数(例如,当 T = uint8_t,R = uint16_t 时)。

在我看来,这应该可以通过 limits 或 type_traits 或类似的东西来实现,但到目前为止我还没有想到解决方案。 C++11 或更高版本都可以。我宁愿避免提升,但如果这是唯一的方法,我也有兴趣看到基于提升的解决方案。

最佳答案

您可以创建自己的模板大小的类型并使用它们来定义您的返回类型,如下所示:

#include <cstdint>
template<int N>
struct sized_uint {};
template<> struct sized_uint<8 > { using type=std::uint8_t; };
template<> struct sized_uint<16> { using type=std::uint16_t; };
template<> struct sized_uint<32> { using type=std::uint32_t; };
template<> struct sized_uint<64> { using type=std::uint64_t; };

#include <climits>
template<typename T>
auto multiply(T lhs, T rhs)
{
using R=typename sized_uint<CHAR_BIT*sizeof(T)*2>::type;
return static_cast<R>(static_cast<R>(lhs) * static_cast<R>(rhs));
}

See it live.

关于c++ - 将 C++ 整数类型模板参数转换为 "longer"整数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54414263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com