用户文字中的多个参数

时间:2013-12-07 11:36:35

标签: c++ c++11

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

3 个答案:

答案 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

您的声明只能使用这些列表,您可以使用第二个参数作为字符串文字,它将自动设置。