2013-02-09 3 views
3

해당 이름을 매크로에 전달하지 않고 사용되는 클래스 유형을 사용하는 매크로를 갖고 싶습니다. 이렇게하려면 typedef decltype(*this) my_type;을 시도했지만 this은 비 정적 멤버 함수에서만 사용할 수 있습니다. 어떤 아이디어?포함하는 클래스 유형 가져 오기

편집 (코멘트 복사) : 나는 기본 클래스를 만들어 원활 CRTP를 사용하여 클래스의 데이터의 트리플 버퍼링을 구현하는 매크로를 설정 한

. 3 중 버퍼링 클래스가 다른 트리플 버퍼링 클래스를 상속 할 때 복잡성이 발생합니다. 사실상 두 개의베이스가 있습니다. CRTP 기본 매크로와 명시 적 기본이 숨겨져 있습니다. 명시 적 기본은 CRTP 기본의 다른 인스턴스화를 상속하기 때문에 파생 클래스의 멤버 함수가 두 기본간에 충돌합니다. 파생 된 클래스 내의 함수를 다시 구현하면이 충돌을 자동으로 해결하는 매크로를 작성하고 있습니다. 이 재 구현에서는 CRTP 클래스의 올바른 인스턴스화에 액세스하기 위해 파생 클래스의 유형이 필요하므로 원래의 질문이됩니다.

+0

잠깐, 수업 내용을 쓰고 있다고 나에게 이야기하고 있긴하지만, 어느 쪽인지는 모르겠다. –

+1

이 특정 접근법으로 해결하려는 문제점은 무엇입니까? – phant0m

+0

@BartekBanachewicz 예, 간접적으로 매크로를 통해. – Dylan

답변

1

경고 : 다음은 이 아니며 표준 준수입니다. 내가 GCC에 -fpermissive를 전달할 경우에만 작동하고 컴파일 할 때 그것은 추한 경고를 출력합니다

#include <type_traits> 

#define JOIN(A, B) JOIN_INTERNAL(A, B) 
#define JOIN_INTERNAL(A, B) A##B 
#define UNIQUE_NAME JOIN(unique_prefix_to_typedef_this_, __LINE__) 

template< typename T > struct class_type; 
template< typename T, typename C > struct class_type< T C::* > { typedef C type; }; 

#define TYPEDEF_THIS void UNIQUE_NAME(); typedef class_type< decltype(&UNIQUE_NAME) >::type 

struct A 
{ 
    TYPEDEF_THIS my_type; 
    static_assert(std::is_same< my_type, A >::value, "my_type is not A if this fails"); 
}; 

int main() 
{ 
} 

당신이 그것을 사용할 수 있기를 바랍니다, 그렇지 않으면 내가 표준 규격에 부합하는 솔루션이없는 확신 해요.

+0

표준 준수 솔루션이 필요했습니다. 그러나 다른 해결책이 곧 제시되지 않으면 귀하의 답변을 수락 할 것입니다. – Dylan