如何在命名空间内引用用户定义字面量运算符?

21
请看下面的内容:

考虑以下情况:

#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 */
}

我可以通过显式使用 using namespace X; 来引用位于 namespace X 内的用户定义字面量操作符。有没有不必显式包含命名空间就能引用字面量操作符的方法? 我尝试过

10_X::test;

但是,当解析器认为X是操作符的名称时,它自然而然地无法工作。

X::operator ""_test(10)

这个功能可以正常运行,但操作起来不太方便。


1
如果您必须明确限定UDL,那么UDL的意义何在? - Vittorio Romeo
1
你是在寻找 using X::""_test; 吗? - Jesper Juhl
3
为了解决这个问题,字面量可以放入它们自己的字面量命名空间中,然后只需要包含该命名空间,而不是整个命名空间。你还可以使用 using X::operator ""_test - NathanOliver
@vsoftco 是的。评论已编辑。 - NathanOliver
@JesperJuhl:抱歉,我已经删除了我的评论,因为它有一个拼写错误。但对我来说,这仍然是关于优先级的问题。为什么人们甚至会考虑UDL呢? - Bathsheba
显示剩余3条评论
1个回答

29
#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 同时存在于 XX::literals 中。这使得人们可以使用命名空间 X::literals; 而不必导入来自 X 的所有内容,但在 X 中,_test 也是可用的。

导入单个字面值有点麻烦。

stdstd::chronostd::literalsstd::chrono::literals 中都这样做了。内联命名空间 允许您定义您认为人们希望作为一个块导入而不获取其余部分的命名空间的子部分。


太棒了,看起来是正确的方法。 - vsoftco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接