有没有一种解决方法可以在 C++ 中为短裤定义用户定义的文字?
Is there a workaround to define a user-defined literal for shorts in c++?
我想为短裤定义一个用户定义的文字。就像这样:
short operator"" _s(int x)
{
return (short) x;
}
为了定义一个短的像这样:
auto PositiveShort = 42_s;
auto NegativeShort = -42_s;
但是,如 this post 中所述,C++11 标准禁止用户定义文字的上述实现:
Per paragraph 13.5.8./3 of the C++11 Standard on user-defined literals:
The declaration of a literal operator shall have a parameter-declaration-clause equivalent to one of the following:
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
对于肯定的情况,我可以只使用 unsigned long long int
,但这对否定的情况不起作用。是否有可能使用更新的 c++ 未来的解决方法?
正如here所解释的那样,一元-
被应用于42_s
的结果,因此似乎无法避免积分提升。根据应用程序,以下解决方法可能会有一些用处:
struct Short {
short v;
short operator+() const {
return v;
}
short operator-() const {
return -v;
}
};
Short operator"" _s(unsigned long long x) {
return Short{static_cast<short>(x)};
}
auto PositiveShort = +42_s;
auto NegativeShort = -42_s;
static_assert(std::is_same_v<decltype(PositiveShort), short>);
static_assert(std::is_same_v<decltype(NegativeShort), short>);
我想为短裤定义一个用户定义的文字。就像这样:
short operator"" _s(int x)
{
return (short) x;
}
为了定义一个短的像这样:
auto PositiveShort = 42_s;
auto NegativeShort = -42_s;
但是,如 this post 中所述,C++11 标准禁止用户定义文字的上述实现:
Per paragraph 13.5.8./3 of the C++11 Standard on user-defined literals: The declaration of a literal operator shall have a parameter-declaration-clause equivalent to one of the following:
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
对于肯定的情况,我可以只使用 unsigned long long int
,但这对否定的情况不起作用。是否有可能使用更新的 c++ 未来的解决方法?
正如here所解释的那样,一元-
被应用于42_s
的结果,因此似乎无法避免积分提升。根据应用程序,以下解决方法可能会有一些用处:
struct Short {
short v;
short operator+() const {
return v;
}
short operator-() const {
return -v;
}
};
Short operator"" _s(unsigned long long x) {
return Short{static_cast<short>(x)};
}
auto PositiveShort = +42_s;
auto NegativeShort = -42_s;
static_assert(std::is_same_v<decltype(PositiveShort), short>);
static_assert(std::is_same_v<decltype(NegativeShort), short>);