【问题标题】:Implementing km/h and m/s with user-defined literals使用用户定义的文字实现 km/h 和 m/s
【发布时间】: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_h10.0_m/1_s 的东西,operator/s 都会返回某种Speed。第一个操作数都可以是Length 类型,第二个可以是Time。当然可以随意使用 Boost.Units 或其他现有的东西。
  • @AProgrammer:啊,这很有魅力,谢谢!

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


【解决方案1】:

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

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

// your previous stuff
};

MS 中的非显式constructor 采用KMH

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

// your previous stuff
};

顺便说一句,你可以只使用一个结构 (MS) 并让你所有的 operator ""_ms, ""_kmh 返回MS

【讨论】:

  • 我没想到!但我想我会只为 MS 和 KMH 使用一个结构,这对我来说似乎更容易。
【解决方案2】:

正如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};
}

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2017-11-02
    • 2021-10-29
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多