2013-02-09 85 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