Rod*_*uis 11 c++ operator-overloading user-defined-literals c++11
C++11
提供用户定义的文字.我刚刚开始玩它们,这让我想知道是否可以自动将所有SI乘数添加到我定义的单个文字中?
例如,如果我定义
Length operator "" _m(long double m) {
return Length(m); // Length in meters
}
Run Code Online (Sandbox Code Playgroud)
where Length
是某个Units
基类的子类,我想有一个机制来自动添加(与boost运算符相同的精神)所有文字的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
Run Code Online (Sandbox Code Playgroud)
据我所知,除了一些宏魔术之外,没有办法自动执行此操作,因为所有用户定义的文字都需要一个明确的定义.
..或者我忽略了什么?
我认为没有一种方法可以在没有“奇怪的宏”的情况下完全满足您的要求。据我所知,这是:
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");
}
Run Code Online (Sandbox Code Playgroud)
如果允许使用奇怪的宏,那么类似下面的内容应该可以完成这项工作:
#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");
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
297 次 |
最近记录: |