2012-05-18 3 views
4

C++ 유형의 경우 <type_traits> 헤더는 많은 유용한 컴파일 시간 반영 기능을 제공합니다. 예 : std::is_base_of<B, D>::valueBD의 기본 클래스인지 여부를 컴파일 타임에 결정합니다.C++에서 네임 스페이스 멤버십을 감지 할 수 있습니까?

유사한 줄에서 네임 스페이스 멤버십을 감지 할 수 있는지 궁금합니다. 예 : 형식이 TN이 주어진 경우 IS_NAMESPACE_MEMBER_OF(T,N) 형식의 매크로 식을 사용하여 NT이 포함되어 있는지를 확인하는 방법이 있습니까?

어떤 종류의 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!  
+1

다음과 같이 말하십시오 :'struct T {}; 네임 스페이스 N {struct T; }', 결과를 true/false로 바꾸시겠습니까? 이'namespace A {struct T {}; } 네임 스페이스 B {using :: A :: T; }''A' 네임 스페이스의'T '부분입니까? –

+1

편집 (즉, 함수 생성)에서 매크로 방식의 문제점은 다른 네임 스페이스의 네임 스페이스 수준 및 * 외부 *에서만 사용할 수 있으므로 매우 제한된 사용이라는 것입니다. –

+0

@ DavidRodríguez -dribeas 귀하의 첫 번째 의견에 관해서, 나는 말하고 싶습니다 : 예,'T'는'A'의 일부이고'T'는'B'의 일부입니다. 'T'가 다중 (중첩되지 않은) 네임 스페이스의 멤버가 될 수없는 이유는 무엇입니까? 결국,'T'는 또한 다른 클래스의 기본 클래스 또는 파생 클래스 일 수 있습니다. 나는 'T'의 전체 사슬을 결정하지 않고있다. 그냥 간단한 질문 : 'N'에'T '가 포함되어 있습니다 (직접 정의 또는 using 문을 통해) – TemplateRex

답변

4

네임 스페이스는 올바른 템플릿 매개 변수가 아니므로 클래스 특성이 될 수 없습니다. 아마도 당신은 매크로로 무언가를 모호하게 할 수 있습니다. 테스트 네임 스페이스에 함수를 삽입하고 ADL과 함께 sizeof/decltype 트릭을 사용하여 어떤 과부하가 선택되었는지 확인할 수 있습니다.

+0

네임 스페이스를 템플릿 매개 변수로 만드는 내 어리석은 실수를 지적 해 주셔서 감사합니다. 질문에 수정되었습니다. – TemplateRex

+0

이름 삽입에 대한 귀하의 제안은 한 것 같습니다. 찌르기. 이것은 형질 특성에 대한 sizeof + test 함수에 함수 인수를 주입하는 것과 다소 비슷합니다. 시도해볼만한 구체적인 코드 제안이 있습니까? – TemplateRex

+3

사실, 비슷한 점이 있습니다. 그러나 ADL은 네임 스페이스가 클래스의 관련 네임 스페이스 집합에 속하고 클래스가 이러한 네임 스페이스에 속하는지 여부 만 알 수 있습니다.나는 네임 스페이스 멤버쉽 테스트가 네임 스페이스에 대한 몇 가지 복잡한 속성을 사용하여 가능하다고 생각하지만 실제로 생각보다 유용하다고는 생각하지 않는다. –