其他分享
首页 > 其他分享> > c – 将类型附加到标量的首选机制?

c – 将类型附加到标量的首选机制?

作者:互联网

[编辑:改变米/码到foo / bar;这不是关于将米转换为码. ]

将类型附加到标量(例如双精度)的最佳方法是什么?典型的用例是度量单位(但我不是在寻找实际的实现,boost has one).

这看起来很简单:

template <typename T>
struct Double final
{
    typedef T type;
    double value;
};

namespace tags
{
    struct foo final {};
    struct bar final {};
}
constexpr double FOOS_TO_BARS_ = 3.141592654;
inline Double<tags::bar> to_bars(const Double<tags::foo>& foos)
{
    return Double<tags::bar> { foos.value * FOOS_TO_BARS_ };
}

static void test(double value)
{
    using namespace tags;
    const Double<foo> value_in_foos{ value };    
    const Double<bar> value_in_bars = to_bars(value_in_foos);
}

那是真的吗?或者这种方法是否存在隐藏的复杂性或其他重要因素?

这似乎远远超过

   inline double foos_to_bars(double foos)
   {
      return foos * FOOS_TO_BARS_;
   }

没有添加任何复杂性或开销.

解决方法:

首先,是的,我认为你所建议的方式是非常合理的,不过它是否优先取决于具体情况.
您的方法的优势在于您定义的转换可能不仅仅是简单的乘法(例如Celsius和Fahrenheit).

但是,您的方法会创建不同的类型,从而需要创建转换,这可能是好的还是坏的,具体取决于用途.

(我很欣赏你的码和米只是一个例子,我也将它作为一个例子)

如果我正在编写处理长度的代码,(大多数情况下)无论单位是什么,逻辑都是相同的.虽然我可以使包含该逻辑的函数成为模板,因此它可以采用不同的单元,但仍然有一个合理的用例,需要来自2个不同来源的数据并提供给不同的单元.在这种情况下,我宁愿处理一个Length类而不是每个单元的类,这些长度可以保存它们的转换信息,也可以只使用一个固定单元,在输入/输出级进行转换.

另一方面,当我们有不同类型的不同测量时,例如长度,面积,温度.没有这些类型之间的默认转换是一件好事.而且我不能无意中增加一个温度的长度.

(当然,类型的乘法是不同的.)

标签:units-of-measurement,c,templates,types
来源: https://codeday.me/bug/20190929/1833550.html