C 名称空间:使用无拥有

C++ namespace: using without owning

本文关键字:拥有 空间      更新时间:2023-10-16

我想在我的名称空间中使用其他名称空间中的东西,而不会使其成为我的命名空间的一部分。更具体的我有以下情况:

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保持一致,而some_function不在using namespace之后。您认为一致性论点值得头痛吗?

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

您可以尝试使用嵌套的detail名称空间,然后仅将您想要的东西展示到主my_ns名称空间:

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

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

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();
}