C++ 유형의 경우 <type_traits>
헤더는 많은 유용한 컴파일 시간 반영 기능을 제공합니다. 예 : std::is_base_of<B, D>::value
은 B
이 D
의 기본 클래스인지 여부를 컴파일 타임에 결정합니다.C++에서 네임 스페이스 멤버십을 감지 할 수 있습니까?
유사한 줄에서 네임 스페이스 멤버십을 감지 할 수 있는지 궁금합니다. 예 : 형식이 T
인 N
이 주어진 경우 IS_NAMESPACE_MEMBER_OF(T,N)
형식의 매크로 식을 사용하여 N
에 T
이 포함되어 있는지를 확인하는 방법이 있습니까?
어떤 종류의 SFINAE/ADL 유형의 트릭을 통해 컴파일 타임 응답을 선호합니다. 또는 그것이 가능하지 않은 경우, 표준이 이것을 허용하지 않는 이유에 대한 어떤 종류의 추론.
이식성이없고 런타임이되는 해킹은 typeid(T).name()
을 N
으로 바꾸는 것이지만, 이것은 지루하고 컴파일 시간에는 문제가되지 않습니다.
EDIT1 : K-ballo가 지적한대로 네임 스페이스는 템플릿 매개 변수로 사용할 수 없으므로 형식 특성이 불가능 해 보입니다.
EDIT2 : 다음은 K-ballo가 암시 한 해골입니다. 그곳에서 요리 할 수있는 시험은 무엇입니까?
#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!
다음과 같이 말하십시오 :'struct T {}; 네임 스페이스 N {struct T; }', 결과를 true/false로 바꾸시겠습니까? 이'namespace A {struct T {}; } 네임 스페이스 B {using :: A :: T; }''A' 네임 스페이스의'T '부분입니까? –
편집 (즉, 함수 생성)에서 매크로 방식의 문제점은 다른 네임 스페이스의 네임 스페이스 수준 및 * 외부 *에서만 사용할 수 있으므로 매우 제한된 사용이라는 것입니다. –
@ DavidRodríguez -dribeas 귀하의 첫 번째 의견에 관해서, 나는 말하고 싶습니다 : 예,'T'는'A'의 일부이고'T'는'B'의 일부입니다. 'T'가 다중 (중첩되지 않은) 네임 스페이스의 멤버가 될 수없는 이유는 무엇입니까? 결국,'T'는 또한 다른 클래스의 기본 클래스 또는 파생 클래스 일 수 있습니다. 나는 'T'의 전체 사슬을 결정하지 않고있다. 그냥 간단한 질문 : 'N'에'T '가 포함되어 있습니다 (직접 정의 또는 using 문을 통해) – TemplateRex