7

テンプレートのメタプログラミングを使用して、任意の構造体またはクラスをタプルに変換することは可能ですか?

例えば:

struct Foo
{
  char         c;
  int          i;
  std::string  s;
};

typedef std::tuple< char, int, std::string >  Foo_Tuple;

Foo_Tuple を自動的に生成するテンプレート コードがあると便利です。

答え

これは、このような単純なケースではやり過ぎですが、より複雑なケース (たとえば、ORM や定型コードを大量に記述する必要があり、単なるテンプレートやマクロでは不十分な場合) では、Boost Mirrorを使用します。非常に重宝しそうです。Boost Mirror についてもう少し掘り下げてみました。基本的なリフレクション機能 (Mirror と Puddle で) は理解するのが難しくなく、セットアップも非常に簡単で、非常に広範に見えます (C++11 を含む多くの構造を処理できます)。列挙型クラスなど...)。この基本機能は十分すぎるほどのものだと思います。クラスをリフレクションに公開したい範囲でマクロを使用するだけです (定型コードを書く必要がないように)。ファクトリ ジェネレータも非常に強力なようです (同じ初期マクロ セットアップを使用して、JSON、SOCI、またはストリームなどを出力する任意のファクトリ ジェネレータを交換できます...)。独自のファクトリ ジェネレータを作成する場合は、セットアップします。最後に 2 つのメモ: いくつかの微調整を加えて、gcc 4.7.2 の C++11 で動作させることができました。また、ドキュメンテーションは十分に DOxygenated されており、すぐに使い始めるのに十分な数の例があるようです。

4

1 に答える 1

7

C++ でこれを行う方法はないと思います。

構造体のフィールド/タイプを列挙する方法がわかりません-それができれば、そのようなタプルを構築するのはかなり簡単だと思います。

Boost.Fusion には FUSION_ADAPT_STRUCT と呼ばれるこれを支援するマクロがあると思いますが、それはすべて手動です。

これの専門用語は「リフレクション」で、「C++ リフレクション」を検索すると、多くの情報を見つけることができます。

そのような記事の 1 つを次に示します。C++ アプリケーションにリフレクションを追加するにはどうすればよいですか?

于 2012-12-15T06:42:16.643 に答える