【发布时间】:2014-10-08 22:15:24
【问题描述】:
我想实现两个user-defined literals,_kmh 表示每小时公里数,_ms 表示每秒米数。我已经有两个结构和运算符“”函数:
constexpr KMH operator "" _ms(long double val) {
return KMH {static_cast<double>(val * 3.6)};
}
constexpr MS operator "" _kmh(long double val) {
return MS {static_cast<double>(val / 3.6)};
}
我希望它以一种我可以这样做的方式实现它:
void func(MS speed) {}
int main() {
func(10.0_kmh); // this works
func(10.0_ms); // this does not
}
我无法让第二个电话开始工作,因为我无法像这样实现它:
constexpr KMH operator "" _kmh(long double val) {
return KMH {static_cast<double>(val)};
}
这显然给了我错误
错误:仅返回类型不同的函数不能重载
有没有办法实现我想要的?
【问题讨论】:
-
我认为 KMH 和 MS 需要是不同的类型(不仅仅是 typedeff'd)。
-
@Galik:嗯,它们都是基于双精度的,但是是独立的结构。
-
我只有一种速度类型,基本单位和文字运算符转换为基本单位。
-
我可能会选择更像
10.0_km/1_h或10.0_m/1_s的东西,operator/s 都会返回某种Speed。第一个操作数都可以是Length类型,第二个可以是Time。当然可以随意使用 Boost.Units 或其他现有的东西。 -
@AProgrammer:啊,这很有魅力,谢谢!
标签: c++ c++11 user-defined-literals