我在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
答案 0 :(得分:5)
此功能不存在 - 但您可以模仿它!
例如,您可以使用以下语法:
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;
答案 1 :(得分:0)
不,没有这样的功能。很抱歉成为坏消息的承担者!
答案 2 :(得分:0)
您无法声明任意参数列表。根据§13.5.8:
3 文字运算符的声明应具有等效于以下之一的参数声明子句:
const char*
unsigned long long int
long double
char
wchar_t
char16_t
char32_t
const char*, std::size_t
const wchar_t*, std::size_t
const char16_t*, std::size_t
const char32_t*, std::size_t
您的声明只能使用这些列表,您可以使用第二个参数作为字符串文字,它将自动设置。