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

标签 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)};
}

这显然给了我错误

error: functions that differ only in their return type cannot be overloaded

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

最佳答案

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

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

// your previous stuff
};

MS 中采用 KMH

的非显式构造函数
class MS
{
public:
    constexpr MS(const KMH& kmh) : val(kmh.val * 3.6) {}

// your previous stuff
};

顺便说一句,你可能只坚持一个结构(MS)并让你所有的operator ""_ms, ""_kmh return MS

关于c++ - 使用用户定义的文字实现 km/h 和 m/s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26267364/

相关文章:

c++ - 根据索引移除 vector 元素

c++ - 对功能代码块的 undefined reference

c++ - boost ipc new 和 delete 运算符

c++ - 没有用户代码的死锁

c++ - 无法将...从 '<brace-enclosed initializer list>' 转换为 map

c++ - 无符号用户定义整数文字

C++ memcpy 返回 true 没有任何变化

C++:将 std::function 转换为 gsl_function

c++ - 用户定义的文字中是否允许使用 C++14 位分隔符?

c++ - 使用用户定义的文字对字符串进行编译时加密