4

その名前をマクロに渡さずに、使用されているクラスの型を使用するマクロが必要です。これを行うために試してみtypedef decltype(*this) my_type;ましたが、this非静的メンバー関数内でのみ使用できます。何か案は?

編集 (コメントのコピー):

CRTP を使用してクラスのデータのトリプル バッファリングをシームレスに実装する基本クラスと一連のマクロを作成しました。複雑なのは、トリプル バッファ クラスが別のトリプル バッファ クラスから継承し、実質的に 2 つのベース (マクロに隠されている CRTP ベースと明示的なベース) を持つ場合に発生します。明示的なベースも CRTP ベースの別のインスタンス化から継承するため、派生クラスのメンバー関数は 2 つのベース間で競合します。派生クラス内の関数を再実装して、この競合を自動的に解決するマクロを作成しています。この再実装には、派生クラスの型が CRTP クラスの正しいインスタンス化にアクセスする必要があるため、元の質問です。

4

1 に答える 1

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()
{
}

それを使用できることを願っています。そうでなければ、標準に準拠したソリューションはないと確信しています。

于 2013-02-15T19:52:51.463 に答える