如何设计一个可以采用数字和单位的代数表达式形式表达式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是可能的.
为了清楚起见,编辑已删除了对源的引用.它可以在这里找到
您需要做的是设计类型,在计算表达式时,它会产生所需的类型.同
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)
然后,我们只需要定义文字运营商的Meter和Second像
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)
这听起来像你想要的东西就像一个单位/量纲分析型系统.请参阅Boost.Units.
基本(长度,时间等)单位的定义类似于持续时间类型std::chrono- 只有一个以上(时间)不同的维度.实现算术运算符以将单元组合成正确尺寸的复合类型.
因此,它不是定义Speed为独立类型,而是从基础Metre和Second类型(它们本身是长度和时间单位的实例,它们可能是由标记类型区分的通用单元模板的实例)派生而来.
如果你想为SI单位编写用户定义的文字,有代码项目或Github上的这个项目中的例子- 我还没有读过它们并且不能保证它们的质量,但这个想法很好.