如何自动添加文字定义,基于单个用户定义的文字?(How to automatically add l

2019-08-17 07:29发布

C++11提供用户定义的文字 。 我刚开始玩弄他们,这使我怀疑它是否有可能自动地都加SI乘到一个单一的文字我定义?

例如,如果我定义

Length operator "" _m(long double m) {
    return Length(m); // Length in meters
}

其中, Length一些的一个子Units的基类,我想有一个机制来自动添加(在相同的精神, 提升运营商 ),SI乘数为返回的所有文字Length

// these are added automatically when defining the literal "_m": 
                                         // Length in:
Length operator "" _Ym(long double Ym);  // Yottameters
Length operator "" _Zm(long double Zm);  // Zetameters
...                                      // ...
...                                      // ...
Length operator "" _km(long double km);  // kilometers
Length operator "" _mm(long double mm);  // millimeters
...                                      // ...       
...                                      // ...
Length operator "" _zm(long double zm);  // zeptometers
Length operator "" _ym(long double ym);  // yoctometers

至于我可以看到,除了或许有些宏观魔法,也没有办法,因为所有用户定义的文字需要一个明确的定义来自动执行此操作。

..或者我俯瞰的东西吗?

Answer 1:

我不认为有一种方法可以做到你所要求的正是为没有“离奇宏”。 这是据我可以得到:

template<typename T, T (*op)(long double)>
struct SI
{
    // ...
    constexpr static T micro = op (.000001);
    constexpr static T milli = op (.001);
    constexpr static T kilo = op (1000);
    constexpr static T mega = op (1000000);
    // ...
};

struct Length
{
    constexpr Length(long double d) : _d(d) { }
    constexpr operator long double() { return _d; }
    long double _d;
};

constexpr Length operator "" _m(long double m) {
    return Length(m);
}

typedef SI<Length, ::operator "" _m> SI_Length;

int main()
{
    constexpr Length l = 3 * SI_Length::kilo;
    static_assert(l == 3000, "error");
}

如果离奇宏是允许的,然后像下面应该做的工作:

#define DEFINE_SI_MULTIPLIERS(T, unit) \
    constexpr T operator "" _u ## unit(long double m) \
    { return ::operator "" _ ## unit(0.000001 * m); } \
    constexpr T operator "" _m ## unit(long double m) \
    { return ::operator "" _ ## unit(0.001 * m); } \
    constexpr T operator "" _k ## unit(long double m) \
    { return ::operator "" _ ## unit(1000 * m); } \
    // ...

DEFINE_SI_MULTIPLIERS(Length, m)

int main()
{
    constexpr Length l = 3.0_km;
    static_assert(l == 3000, "error");
}


Answer 2:

你不能使用operator "" _m(const char *)只要你愿意来解析自己的花车味道? 这使得它可以编写1234k_m通过调用出一个共同的SI-感知的解析器为您的浮点值。



文章来源: How to automatically add literal definitions, based on a single user-defined literal?