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

时间:2018-06-20 07:47:25

标签: c++ c++11 c++14 constexpr user-defined-literals

我在MyLiteral.h中定义了以下用户定义的文字:

namespace my_literals {
    constexpr uint64_t operator"" _nanoseconds(unsigned long long int value) {
        return value*1000;
    }
}

现在我可以在另一个标头SomeComponent.h中使用运算符:

using namespace my_literals;
namespace foo {
    constexpr uint64_t timeout = 10_nanoseconds;
}

但是,我不想用using namespace my_literals来污染范围,因为这将为所有包含*.cpp的{​​{1}}文件提供字面定义。

如何避免这种情况?在g ++中,SomeComponent.h给出期望的unqualified-id之前的数字常量

3 个答案:

答案 0 :(得分:12)

在C ++ 17中,使用constexpr lambda,您可以这样做:

namespace foo {
    constexpr uint64_t timeout = []{ using namespace my_literals; return 10_nanoseconds; }();
}

(C ++ 11及更高版本)的替代:

namespace foo {
    constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}

namespace foo {

    namespace detail
    {
        using namespace my_literals;
        constexpr uint64_t timeout = 10_nanoseconds;
    }
    using detail::timeout;
}

答案 1 :(得分:5)

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

namespace foo {
    constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}

答案 2 :(得分:0)

您可以将using声明放入命名空间中(如果您不介意使用foo::operator""_nanoseconds):

namespace foo {
    using namespace my_literals;
    constexpr uint64_t timeout = 10_nanoseconds;
}