如何设计一个可以采用带数字和单位的代数表达式形式的表达式的类型,其中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);
我们需要
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);
}
然后我们只需要为
Meter
和Second
定义literal operatorsMeter 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))