Search code examples
c++c++11user-defined-literals

How to refer to user defined literal operator inside a namespace?


Consider the following:

#include <iostream>

namespace X
{
    void operator ""_test(unsigned long long x)
    {
        std::cout << x;
    }
}

int main()
{
    using namespace X;
    10_test;
    // 10_X::test; /* doesn't work */
}

I can refer to the user defined literal operator inside the namespace X by an explicit using namespace X;. Is there any way of referring to the literal operator without explicitly including the namespace? I tried the

10_X::test;

but of course doesn't work as the parser believes X refers to the name of the operator.

X::operator ""_test(10)

works but it's clumsy.


Solution

  • #include <iostream>
    
    namespace X {
      inline namespace literals {
        void operator ""_test(unsigned long long x) {
          std::cout << x;
        }
      }
    }
    
    int main() {
      {
        using namespace X::literals;
        10_test;
      }
      {
        using X::operator""_test;
        10_test;
      }
    }
    

    _test is both in X and X::literals. This permits people to using namespace X::literals; without pulling in everything from X, yet within X _test is also available.

    Importing an individual literal is a bit annoying.

    std does this with both std::chrono and std::literals and std::chrono::literals. inline namespaces let you define subsections of your namespace that you think people would want to import as a block without getting the rest of it.