2012-07-25 4 views
5

structの中に「現在のタイプstruct」を取得することはできますか? は例えば、私はこのような何かをしたい:構造体/クラスの内部の「現在の型」に関する情報を取得するには?

struct foobar { 
    int x, y; 

    bool operator==(const THIS_TYPE& other) const /* What should I put here instead of THIS_TYPE? */ 
    { 
    return x==other.x && y==other.y; 
    } 
} 

私はこのようにそれを実行しようとしました:

struct foobar { 
    int x, y; 

    template<typename T> 
    bool operator==(const T& t) const 
    { 
    decltype (*this)& other = t; /* We can use `this` here, so we can get "current type"*/ 
    return x==other.x && y==other.y; 
    } 
} 

が、それは醜い、最新のC++標準、およびMSVC connotのサポートが必要ですコンパイルしてください( "内部エラー"でクラッシュします)。

struct foobar { 
    int x, y; 
    GEN_COMPARE_FUNC(x, y); 
} 

struct some_info { 
    double len; 
    double age; 
    int rank; 
    GEN_COMPARE_FUNC(len, age, rank); 
} 

しかし、私はマクロの内部に「現在のタイプを」知っている必要があります:

は実は、私はちょうどoperator==などの自動生成機能にいくつかのプリプロセッサマクロを書きたいです。

+1

理由だけではなく、代わりに(foobarに、x、y)はマクロGEN_COMPARE_FUNCを作ってみませんか? 'Variadic Macros 'を介して@ForEveR。 – Rollie

+0

それはGCCとMSVCによってサポートされているので、それで十分です。 – qehgt

+0

テンプレート化された 'bool演算子=='を使うことで、誤って2つの型を比較す​​ることができます。 –

答えて

0

実際、このような使い方ができます。

#define GEN_COMPARE_FUNC(type, x, y)\ 
template<typename type>\ 
bool operator ==(const type& t) const\ 
{\ 
    return this->x == t.x && this->y == t.y;\ 
} 

struct Foo 
{ 
    int x, y; 
    GEN_COMPARE_FUNC(Foo, x, y); 
}; 

私は考えていません。マクロパルスをこのようにして(私たちはparamsを投げて、これからとtからそれぞれのパーを比較する必要があります。マクロでparamsをどのように展開するのか分かりません)。

0

このスタックオーバーフローのURLは、それ自体で++ Boostライブラリは、式の型を計算できると述べているが、C/Cすることができません。

Getting name and type of a struct field from its object

誰かにも同様の質問を:

をtypeof演算の使用を開始するHow can I add reflection to a C++ application?

はtypeof演算ヘッダを含む:

BOOST_TYPEOFマクロを使用してコンパイル時に式の種類を推定する3210

namespace ex1 
{ 
    typedef BOOST_TYPEOF(1 + 0.5) type; 

    BOOST_STATIC_ASSERT((is_same<type, double>::value)); 
} 
+0

C++ 11は可能です。 typedef decltype(1 + 0.5)型。 – ForEveR

関連する問題