2014-02-01 2 views
1

클래스에 포인터 데이터 멤버가 있는지 테스트 할 수 있습니까?클래스에 포인터 데이터 멤버가 있는지 확인

class Test 
{ 
    int* p; 
} 

template< typename T > 
foo(T bla) 
{ 
} 

컴파일해서는 안됩니다. Test에는 포인터 데이터 멤버가 있기 때문입니다.

Test test; 
foo(test) 

아마도 템플릿을 사용하지 못하도록 특성을 사용할 수 있습니까? 또는 유일한 옵션 매크로입니까? 부스트가 그것을 할 수 있는지 아는 사람이 있습니까?

+2

foo()에 대한 반환 유형을 선언해야합니다. – alexolut

+1

http://www.gockelhut.com/c++/articles/has_member –

+2

템플릿 기능에서 무엇을하고 싶습니까? 클래스에서 포인터와 어떻게 연관되어 있습니까? – alexolut

답변

2

그렇지 않으면 작동하지 않습니다, 다음은 보호로 작동 할 수 있지만, 멤버 변수에 액세스 할 수 있도록 (public)가 :

#include <type_traits> 

class Test 
{ 
public: 
    int* p; 
}; 

template< typename T > 
typename std::enable_if< std::is_pointer< decltype(T::p) >::value >::type 
foo(T bla) { static_assert(sizeof(T) == 0, "T::p is a pointer"); } 

template< typename T > 
void foo(T bla) 
{ 
} 

int main() 
{ 
    Test test; 
    foo(test); 
} 
물론

Live example

당신이 알 필요가 검사 할 멤버 변수의 이름. C++에 내장 된 일반적인 반사 메커니즘이 없기 때문입니다.


모호성이 has_pointer 도우미 만드는 것입니다 피할 수있는 또 다른 방법 : 단순히 멋진을 얻을 수있는 함수에 첫 번째 라인으로 static_assert을 추가

template< typename, typename = void > 
struct has_pointer : std::false_type {}; 

template< typename T > 
struct has_pointer< T, typename std::enable_if< 
         std::is_pointer< decltype(T::p) >::value 
         >::type > : std::true_type {}; 

template< typename T > 
void foo(T bla) 
{ 
    static_assert(!has_pointer<T>::value, "T::p is a pointer"); 
    // ... 
} 

Live example

주 , 읽을 수있는 오류 메시지.

template< typename T > 
typename std::enable_if< !has_pointer<T>::value >::type 
foo(T bla) 
{ 
    // ... 
} 
+0

아마 'foo' 호출에서 모호성을 제거해야합니다. – dyp

+0

@dyp 대답을 업데이트하여 오류/과부하 상황을 개선하는 두 가지 방법을 보여줍니다. –

+0

물론 이것은 하나의 멤버 만있을 것이라고 가정하고 이름은 p입니다. – sehe

1

은 우리가 이름을 모르는있는 포인터 데이터 멤버를 확인 할 수있는 방법이 있는지 알고 싶습니다 : 당신은, 물론,이 같은 뭔가 함수 자체를 해제 할 수 . 예를 들어 p를 주었지만 그 이름이 무엇인지 알지 못하거나 단지 포인터 데이터 멤버가 하나 밖에없는 경우라면

나는 그렇게 생각하지 않는다.

gcc의 -WeffC++를 사용하면 최소 특수 멤버가 정의되지 않은 포인터 멤버가있는 클래스에 대해 경고합니다.

내가 정말로 생각한 것은 "이 클래스에는 가치 의미론이 있습니까?"("이걸 깊이 복제해야합니까?")입니다. C++에서는 복사/할당이 금지 된 경우를 제외하고 으로 가정해야합니다..