gpt4 book ai didi

c++ - 如何使用编译时常量原语类型

转载 作者:行者123 更新时间:2023-11-28 01:25:20 26 4
gpt4 key购买 nike

如何使用编译时常量原语的类型作为其他变量的类型声明?

我正在尝试使用 C++ 进行一些模板元编程以进行 SI 单位转换。归结为如何在一加运算符后自动确定我需要的原始精度。例如:

template<typename Precision>
class Unit {
public:
Unit(Precision v) : value(v) {}
Precision value;
};
template<typename Precision1, typename Precision2>
struct PrecisionTransform {
constexpr static auto test = (Precision1)1 * (Precision2)1; // Compile time constant
using Type = Precision1; // TODO: ideally typeof(test)
};
template<typename Precision1, typename Precision2>
Unit<PrecisionTransform<Precision1, Precision2>::Type> operator+(const Unit<Precision1>& x, const Unit<Precision2>& y)
{
return Unit<PrecisionTransform<Precision1, Precision2>::Type>(x.value + y.value);
}

int main()
{
Unit<double> a = 2.0;
Unit<float> b = 1.0f;
auto c = a + b;
return 0;
}

或者简单来说,这样的事情会发生吗?

float a = 1;
typeof(a) b = 2;

这似乎很有可能,因为我已经走了这么远。但是不知道怎么用

最佳答案

你几乎明白了。正如 max66 已经指出的那样,使用 decltype .首先,您可以更换您的 PrecisionTransform具有以下类型别名的类(为此你必须 #include <utility>):

template <typename Precision1, typename Precision2>
using TransformType = decltype(std::declval<Precision1>() * std::declval<Precision2>());

std::declval<XYZ>()只是一种更通用的说法 (Precision1)1这允许您还使用没有可访问构造函数的类型(在您的情况下无关紧要,因为您只使用原语)。

你的 operator+然后更改为:

template<typename Precision1, typename Precision2>
Unit<TransformType<Precision1, Precision2>> operator+(const Unit<Precision1>& x, const Unit<Precision2>& y)
{
return Unit<TransformType<Precision1, Precision2>>(x.value + y.value);
}

请注意,您的 operator+ 版本中有错字(两个操作数都使用了 Precision1 )。

如你所见here , 主要的编译器都同意这一点。

关于c++ - 如何使用编译时常量原语类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138457/

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