2016-12-16 5 views
0

Я хочу использовать материал из другого пространства имен в моем пространстве имен, не делая его частью моего пространства имен. Более конкретный У меня следующая ситуация:Пространство имен C++: использование без использования

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 но для согласованности с std и std::literals не some_function после using namespace. Считаете ли вы, что аргумент согласованности стоит головной боли?

И если да, есть ли способ сделать это или сделать что-то подобное?

+1

Ответ прост: не сдуть ваши пространства имен с помощью директивы. –

+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; 
} 
Смежные вопросы