我在cppreference.com上找到了以下示例:

// used as conversion
inline constexpr long double operator"" _deg ( long double deg )
{
    return deg*3.141592/180;
}
...
double x = 90.0_deg; // x = 1.570796

但是现在我想知道是否可以为该函数提供多个参数。这里只有deg。我的意思是这样:0.3_arg1_21arg2

最佳答案

此功能不存在-但您可以模拟它!

例如,您可以使以下语法起作用:

auto result = 0.3_arg1/21_arg2;
/可以用您选择的任何可重载运算符替换-也许,是一个不错的选择,但请注意其优先级较低。我会坚持使用较高的优先级,以确保将其解析为好像是一个文字(即使不是)。

然后,要执行此操作,您需要实现以下操作(仅在我的大脑中进行编译,因此不能保证正确性):
struct value_proxy_lhs { double d; };
struct value_proxy_rhs { double d; };
struct final_value { double a; double b; };

inline constexpr value_proxy_lhs operator ""_arg1(double d) { return {d}; }

inline constexpr value_proxy_rhs operator ""_arg2(double d) { return {d}; }

inline constexpr final_value operator /(value_proxy_lhs lhs, value_proxy_rhs rhs) {
    return {lhs.d, rhs.d};
}

在适当的应用程序中,您可能会向用户尽可能多地隐藏value_proxy_*类,以便他们不会意外产生不完整的值。 –不幸的是,我认为没有办法完全避免这种情况。例如,据我所知,该语言根本无法提供禁止诸如auto x{1_arg1};之类的内容进行编译的方式。将复制构造函数设为private(和final_value变为friend)可能会使代理类成为非POD,因此禁止将它们用作constexpr(AFAIR)。

作为一个现实世界的应用程序,我可以想象一个“字面意义”的日期:
auto date = 2013_yy/12_mm/07_dd;

10-08 20:26