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 はそれをコンパイルできません (「内部エラー」でクラッシュします)。

実際には、次のような関数を自動生成するプリプロセッサ マクロをいくつか書きたいだけですoperator==

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);
}

しかし、マクロ内の「現在の型」を知る必要があります。

4

2 に答える 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);
};

どうやってvarを使うのか分かりません。この方法でマクロパー(パラメーターをスローし、これとtから各パーを比較する必要があります。マクロでパラメーターをどのように展開するかはわかりません)。

于 2012-07-25T15:27:22.340 に答える
0

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

オブジェクトから構造体フィールドの名前と型を取得する

誰かが同様の質問をしました:

C++ アプリケーションにリフレクションを追加するにはどうすればよいですか?

typeof の使用を開始するには、typeof ヘッダーを含めます。

#include <boost/typeof/typeof.hpp>

コンパイル時に式の型を推測するには、BOOST_TYPEOF マクロを使用します。

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

    BOOST_STATIC_ASSERT((is_same<type, double>::value));
}
于 2012-07-25T16:27:07.463 に答える