Ale*_*der 11 c++ user-defined-literals constexpr c++11 c++14
我在以下位置定义了以下用户定义的文字MyLiteral.h:
namespace my_literals {
constexpr uint64_t operator"" _nanoseconds(unsigned long long int value) {
return value*1000;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在另一个标题中使用运算符SomeComponent.h:
using namespace my_literals;
namespace foo {
constexpr uint64_t timeout = 10_nanoseconds;
}
Run Code Online (Sandbox Code Playgroud)
但是,我不想污染范围using namespace my_literals,因为这会为*.cpp包含的所有文件提供文字定义SomeComponent.h.
我怎么能避免这个?在g ++中constexpr uint64_t timeout = my_literals::10_nanoseconds;给出数字常量之前的预期unqualified-id.
Jar*_*d42 12
在C++ 17中,使用constexpr lambda,您可以:
namespace foo {
constexpr uint64_t timeout = []{ using namespace my_literals; return 10_nanoseconds; }();
}
Run Code Online (Sandbox Code Playgroud)
作为(C++ 11及更高版本)的替代品:
namespace foo {
constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}
Run Code Online (Sandbox Code Playgroud)
要么
namespace foo {
namespace detail
{
using namespace my_literals;
constexpr uint64_t timeout = 10_nanoseconds;
}
using detail::timeout;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过显式调用运算符来解决此问题:
namespace foo {
constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}
Run Code Online (Sandbox Code Playgroud)