我在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;