如何在头文件中使用用户定义的文字?

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)


Dei*_*Dei 5

您可以通过显式调用运算符来解决此问题:

namespace foo {
    constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常难看:) (10认同)