用户文本中有多个参数

Multiple arguments in user-literals

本文关键字:参数 文本 用户      更新时间:2023-10-16

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

不,没有这样的功能。很抱歉是坏消息的传递者!