2015-01-31 2 views
3
내가

C++로 클래스를 참조 매크로

struct Foo{ 
    MY_MACRO 
}; 

를 작성하고 그것이 내가 MY_MACRO를 정의하려면 어떻게

struct Foo{ 
    void bar(Foo&){} 
}; 

으로 확장하고 싶지

?

#define MY_MARCO(X) void bar(X&){} 
struct Foo{ 
    MY_MACRO(Foo) 
}; 

이 매우 가깝게하지만 하위 이상적입니다, 내가 클래스 이름을 반복하지 않으과 같이

내가 가지고 올 수있는 유일한 물건은 다음과 같다.

불행하게도 다음은 컴파일되지 않습니다 :

struct Foo{ 
    void bar(decltype(*this)&){} 
}; 
+1

무엇에 대한 템플릿 –

+2

일반적으로, 단지 ** ** 내가 한 번 실험 않았다하지 않는 " NON_COPYABLE "매크로를 사용하고 (1) 클래스 이름을 매크로 인수로 전달하고 (2)"THIS_CLASS "라는 매크로 정의에 의존하는 두 가지 솔루션을 사용해 보았습니다. 그러나 컴파일러가 특히 Visu al C++, 더 나은 해결책은 복사 불가능한 클래스에서 상속하는 것이 었습니다. –

+0

[Curiously Recurring Template Pattern] (http://stackoverflow.com/questions/4173254/what-is-the-curiously-recurring-template-pattern-crtp)을 사용하는 것이 좋습니다. 매크로는 악합니다. –

답변

1

이 밀접하게 this question 관련된다. 대답은 당신이 속한 클래스 정의의 타입을 사용하는 무언가를 쓸 수 없다는 것입니다. 클래스 정의의 시작을 포함하는 매크로를 작성해야합니다 (예 : struct Foo) 및 typedef를 용이하게하는 메커니즘). ..

1

그러나 당신이 static_assert에 decltype(*this)을 사용할 수 있습니다 즉 :?. 대신 매크로의

#include <type_traits> 

struct Foo { 
    template <typename T> 
    void bar(T& t) { 
     static_assert(std::is_same<T&, decltype(*this)>::value, 
        "bar() only accepts objects of same type"); 
    } 
}; 
+0

템플릿을 사용하는 것이 유일한 제정 방법입니다. 나는 또한 B.INS에 대한 mixins와 CRTP에 대한 연구를 제안 할 것이다. C++ 타입 시스템을 사용하는 것은 전처리 기가있는 고대 텍스트 대체 도구를 사용하는 것보다 훨씬 우수하다. –