2013-02-09 80 views
3

我希望有一個宏使用它使用的類的類型,而不將該名稱傳遞給宏。爲此,我嘗試了typedef decltype(*this) my_type;,但this只能在非靜態成員函數中使用。有任何想法嗎?獲取包含類的類型

EDIT(評論複印件):

我做了一個基類,並設置無縫地實現使用CRTP類的數據的三重緩衝宏。當三重緩衝類繼承另一個三重緩衝類時,會出現複雜情況,實際上有兩個基 - 隱藏在宏中的CRTP基和顯式基。由於顯式基礎也從CRTP基礎的不同實例繼承,派生類中的成員函數在兩個基礎之間發生衝突。我正在編寫一個宏,以便在派生類中重新實現函數來自動解決此衝突。這種重新實現需要派生類的類型來訪問CRTP類的正確實例,因此是原始問題。

+0

等等,你是否告訴我你正在課堂上寫作,但不知道里面哪一個? – 2013-02-09 15:01:03

+1

你想用這種特定方法解決什麼問題? – phant0m 2013-02-09 15:01:24

+0

@BartekBanachewicz是的,間接通過宏。 – Dylan 2013-02-09 15:03:45

回答

1

警告:以下是不是標準符合。它只是如果我通過-fpermissive到GCC工程和編譯時它打印一個醜陋的警告:

#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 2013-02-17 16:52:06