C ++命名空间:无需拥有即可使用

时间:2016-12-16 14:39:55

标签: c++ namespaces using

我想在我的命名空间中使用来自另一个命名空间的东西,而不是将它作为我的命名空间的一部分。更具体我有以下情况:

namespace my_ns{
    enum class c: unsigned long long int{};

    namespace literals{
        constexpr c operator"" _c(unsigned long long int i)noexcept{
            return c(i);
        }
    }

    using namespace literals;

    auto xyz = 4_c; // OK: use literals::operator""_c
}

void some_function(){
    using namespace my_ns; // shall not implicit include my_ns::literals!

    auto abc = xyz; // OK
    auto def = 4_c; // shall not know my_ns::literals::operator""_c
}

我想在my_ns中使用用户文字,但与stdstd::literals的{​​{1}}之后的some_function不一致。你认为一致性论证值得头痛吗?

如果是,有没有办法做或做类似的事情?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用嵌套的detail命名空间,然后只将您想要的内容公开给主my_ns命名空间:

namespace my_ns
{
    namespace detail
    {
        using namespace literals;
        auto xyz = 4_c; // OK: use literals::operator""_c
    }

    using detail::xyz;
}

答案 1 :(得分:0)

您可以使用另一个名称空间,然后将其公开给所有人

namespace Rtos
{
  constexpr unsigned long long operator "" ms(unsigned long long ms) 
  {
    return ms / portTICK_PERIOD_MS ; 
  } ;
}

namespace GlobalVars
{
  using Rtos::operator""ms ;
  Rtos::Event event{1000ms, 1} ;
}

using GlobalVars::event ;

void SomeFunction()
{
  event.Signal();
}