Вопрос по c++, c++11 – Можно ли обнаружить членство в пространстве имен в C ++?

4

Для типов C ++<type_traits> заголовок дает нам много полезных возможностей отражения во время компиляции. Например.std::is_base_of<B, D>::value во время компиляции определяет,B это базовый классD.

Интересно, можно ли было бы обнаружить членство в пространстве имен по аналогии? Например. дано пространство именN с типомTесть ли способ определить,T  содержится вN используя макрос выражение формыIS_NAMESPACE_MEMBER_OF(T,N).

Я предпочел бы ответ во время компиляции с помощью любого трюка типа SFINAE / ADL. Или, если это невозможно, какие-то рассуждения, почему Стандарт не допустит этого.

Непереносимый и во время выполнения хак был бы регулярным выражениемtypeid(T).name() заN, но это довольно утомительно и не во время компиляции.

EDIT1: как указывает K-balloon, пространство имен нельзя использовать в качестве параметра шаблона, поэтому черта типа кажется невозможной.

EDIT2Вот скелет, на который намекнул К-балл: какой изящный тест можно (или нельзя?) приготовить там?

#define IS_NAMESPACE_MEMBER_OF(T, N) \
                                     \
// global declaration                \
void test(T);                        \
                                     \
// namespace declaration             \
namespace N {                        \
    void test(T);                    \
}                                    \
                                     \
// some clever name lookup / sizeof / SFINAE test!     
@ DavidRodr & # xED; guez-dribeas Ваш второй комментарий - хороший момент. Но можно обернуть весь макрос в другое пространство имен, чтобы предотвратить загрязнение глобальной области, не так ли? TemplateRex
Скажем, у вас есть:struct T {}; namespace N { struct T; }Вы хотели бы, чтобы результат был истинным / ложным? Как насчет этогоnamespace A { struct T {}; } namespace B { using ::A::T; } являетсяT частьA Пространство имен? David Rodríguez - dribeas
Проблема с макро-подходом в редактировании (то есть, созданием функций) состоит в том, что он будет иметь очень ограниченное использование, так как он может использоваться только на уровне пространства имен иoutside любого другого пространства имен ... David Rodríguez - dribeas
По определению вы не можетеwrap макрос в пространстве имен. Макро-расширение происходитbefore у компилятора есть шанс обработать пространства имен. Что касается вопросов, это имеет значение, поскольку в языке тип определен ровно в одном пространстве имен, даже если вы можете перенести его в область видимости для поиска в других пространствах имен, типах или функциях. Я действительно не вижу, как это вообще можно использовать для чего-либо, но вот некоторые вещи, которые следует учитывать. David Rodríguez - dribeas
@ DavidRodr & gt; guez-dribeas В отношении вашего первого комментария я бы сказал: да,T это частьA, а такжеT это частьB, Почему это было бы невозможно дляT быть членом нескольких (не вложенных) пространств имен? В конце концов,T также может быть базовым или производным классом многих других классов. Я не после: определить всю цепочку областей действияT, Просто простой вопрос:Tсодержалась вN (либо через прямое определение, либо черезusing заявления. TemplateRex

Ваш Ответ

1   ответ
4

Пространство имен не является допустимым параметром шаблона, поэтому оно никогда не может быть признаком класса. Возможно, вы можете сделать что-то непонятное с макросами. Вы можете добавить функции в тестовое пространство имен и использовать ADL вместе сsizeof/decltype трюк, чтобы увидеть, какая перегрузка выбрана.

Error: User Rate Limit Exceeded TemplateRex
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededlanguage-lawyerError: User Rate Limit Exceeded TemplateRex
Error: User Rate Limit Exceeded TemplateRex
Error: User Rate Limit Exceeded

Похожие вопросы