如何设计一个可以采用带数字和单位的代数表达式形式的表达式的类型,其中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

编辑这个问题提出了一个问题,即是否完全可以使用23m形式的文字。

编辑为清楚起见,已从问题中删除了对源的引用。可以找到here

最佳答案

您需要做的是设计类型,当对表达式求值时,它会产生所需的类型。和

change_speed(23m / 10s);

我们需要23m10s来产生一个类型,当您将它们划分在一起时,就会得到一个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);
}

然后我们只需要为MeterSecond定义literal operators
Meter operator "" _m(double value) { return Meter(value); }

Second operator "" _s(double value) { return Second(value); }

我们必须使用_m_s来制作这些有效的用户定义文字。除标准提供的文字外,所有文字都必须以_开头。

然后
change_speed(23_m / 10_s)

变成
change_speed(Meter(23) / Second(10))

变成
change_speed(Speed(2.3))

10-08 08:32
查看更多