以代数表达式作为参数的数字和单位的文字

tob*_*ker 4 c++

如何设计一个可以采用数字和单位的代数表达式形式表达式Speed的类型,类型23m / 10s可以是表达式?

例:

change_speed(Speed s);    // better: the meaning of s is specified
// ...
change_speed(2.3);        // error: no unit
change_speed(23m / 10s);  // meters per second
Run Code Online (Sandbox Code Playgroud)

编辑这个问题提出了一个问题,如果一个文字的形式23m是可能的.

为了清楚起见,编辑已删除了对源的引用.它可以在这里找到

Nat*_*ica 8

您需要做的是设计类型,在计算表达式时,它会产生所需的类型.同

change_speed(23m / 10s);
Run Code Online (Sandbox Code Playgroud)

我们需要23m并且10s每个产生一种类型,当你将它们分开时给你一个Speed.如果我们有

struct Meter
{
    Meter(double value) : value(value) {}
    double value;
};

struct Second
{
    Second(double value) : value(value) {}
    double value;
}

Speeds operator /(const Meter& m, const Second& s)
{
    return Speed(m.value / s.value);
}
Run Code Online (Sandbox Code Playgroud)

然后,我们只需要定义文字运营商MeterSecond

Meter operator "" _m(double value) { return Meter(value); }

Second operator "" _s(double value) { return Second(value); }
Run Code Online (Sandbox Code Playgroud)

我们必须使用_m_s制作这些有效的用户定义文字.所有不符合标准的字面都必须以a开头_.

然后

change_speed(23_m / 10_s)
Run Code Online (Sandbox Code Playgroud)

change_speed(Meter(23) / Second(10))
Run Code Online (Sandbox Code Playgroud)

变成了

change_speed(Speed(2.3))
Run Code Online (Sandbox Code Playgroud)


Use*_*ess 7

听起来像你想要的东西就像一个单位/量纲分析型系统.请参阅Boost.Units.

基本(长度,时间等)单位的定义类似于持续时间类型std::chrono- 只有一个以上(时间)不同的维度.实现算术运算符以将单元组合成正确尺寸的复合类型.

因此,它不是定义Speed为独立类型,而是从基础MetreSecond类型(它们本身是长度和时间单位的实例,它们可能是由标记类型区分的通用单元模板的实例)派生而来.

如果你想为SI单位编写用户定义的文字,有代码项目Github上的这个项目中的例子- 我还没有读过它们并且不能保证它们的质量,但这个想法很好.