我想以每小时千米为单位实现两个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)};
}
这显然给了我错误
错误:仅在返回类型上有所不同的函数不能重载
有没有办法实现我想要的东西?
答案 0 :(得分:2)
您可以添加非显式operator MS()
class KMH
{
public:
operator MS() const { return {val / 3.6}; }
// your previous stuff
};
或constructor
中的非显式MS
,其中KMH
class MS
{
public:
constexpr MS(const KMH& kmh) : val(kmh.val * 3.6) {}
// your previous stuff
};
顺便说一下,你可能只坚持使用一个结构(MS
)并使你的所有operator ""_ms
,""_kmh
返回MS
答案 1 :(得分:0)
正如AProgrammer建议的那样,只使用一个基本结构来提高速度是一个很好的解决方案。
struct speed {
float m_val;
constexpr speed(float val) : m_val{val} {}
operator float() const { return m_val; }
};
constexpr speed operator "" _ms(long double val) {
return speed {static_cast<float>(val)};
}
constexpr speed operator "" _kmh(long double val) {
return speed {static_cast<float>(val) / 3.6f};
}