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

标签 c++ templates types units-of-measurement

[ 编辑:将米/码更改为 foo/bar;这与将米转换为码无关。 ]

将类型附加到标量(例如 double)的最佳方法是什么?典型的用例是度量单位(但我不是在寻找实际的实现,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_;
   }

几乎不增加任何复杂性或开销。

最佳答案

我会采用基于比率的方法,很像 std::chrono . (Howard Hinnant 在他最近的 C++Con 2016 talk about <chrono> 中展示了它)

template<typename Ratio = std::ratio<1>, typename T = double>
struct Distance
{
    using ratio = Ratio;
    T value;
};

template<typename To, typename From>
To distance_cast(From f)
{
    using r = std::ratio_divide<typename To::ratio, typename From::ratio>;
    return To{ f.value * r::den / r::num };
}

using yard = Distance<std::ratio<10936133,10000000>>;
using meter = Distance<>;
using kilometer = Distance<std::kilo>;
using foot = Distance<std::ratio<3048,10000>>;

demo

这是一个天真的实现,可能会得到很大的改进(至少通过在安全的地方允许隐式转换),但它是一个概念证明,并且可以简单地扩展。

优点:

  • meter m = yard{10}是编译时错误或安全隐式转换,
  • 漂亮的类型名称,您必须非常努力地反对解决方案才能进行无效转换
  • 简单易用

缺点:

  • 可能的整数溢出/精度问题(可能会通过实现质量得到缓解?)
  • 正确实现可能并非易事

关于c++ - 将类型附加到标量的首选机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40381918/

相关文章:

c++ - 无法在 OpenCV 中打开共享对象文件 'libopencv_shape.so.3.1'

c++ - 在 Visual C++ 中使用 dllimport

c++ - vector 中的移动元素未按预期工作

c - 在 C 中识别内存中值的数据类型?

typescript :在算术运算中使用 bool 类型

C++ 连接 LPCTSTR

c++ - 使用 getsockname 函数时出现 WSAEFAULT 错误

Django login_required 通过,但 user.is_authenticated 在模板中失败(??)

c++ - 非模板类的构造函数中的模板参数

python - 如何确定 Python 中嵌套数据结构的类型?