1

我想实现两个用户定义的文字,_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)};
}

这显然给了我错误

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

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

4

2 回答 2

2

您可以添加非显式operator MS()

class KMH
{
public:
    operator MS() const { return {val / 3.6}; }

// your previous stuff
};

或非明确constructorMS其中采取KMH

class MS
{
public:
    constexpr MS(const KMH& kmh) : val(kmh.val * 3.6) {}

// your previous stuff
};

顺便说一句,您可能只坚持一个 struct ( MS) 并让所有您的operator ""_ms,""_kmh返回MS

于 2014-10-08T22:33:56.133 回答
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};
}
于 2014-12-23T01:00:33.980 回答