使用用户定义的文字实现km / h和m / s

时间:2014-10-08 22:15:24

标签: c++ c++11 user-defined-literals

我想以每小时千米为单位实现两个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)};
}

这显然给了我错误

  

错误:仅在返回类型上有所不同的函数不能重载

有没有办法实现我想要的东西?

2 个答案:

答案 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};
}