15

Java と C# を見ると、特別な言語ベースの注釈に基づいて、いくつかの邪悪な処理を行うことができます (名前が間違っている場合はご容赦ください)。

C++ では、これに関して 2 つの問題があります。

1) 実行時にアクセス可能な型情報でクラスに注釈を付ける方法はありません。
2) ソースを解析して何かを生成するのは複雑です。

しかし、アノテーションと同じ基本的な効果を実現するために、テンプレートのメタプログラミングを使用してこれを行うことができると考えていました (まだ考えているところです)。さまざまなタイプに特化した char_traits と同様に、xml_traits テンプレートを宣言的な方法で使用できます。この特性クラスを使用して、シリアライズしようとしているクラスの特性を特殊化することにより、クラスをシリアライズ/デシリアライズする方法を定義できます。

考えの例:

template<typename T>
struct XML_traits
{
    typedef XML_Empty   Children;
};

template<>
struct XML_traits<Car>
{
    typedef boost::mpl::vector<Body,Wheels,Engine>   Children;
};

template<typename T>
std::ostream& Serialize(T const&)
{
    // my template foo is not that strong.
    // but somthing like this.
    boost::mpl::for_each<typename XML_Traits<T>::Children,Serialize>(data);
}
template<>
std::ostream& Serialize<XML_Empty>(T const&)
{ /* Do Nothing */ }

私の質問は:

Java や C# などの言語で使用される注釈の概念をエミュレートするために、このような手法 (テンプレート メタプログラミング) を使用するプロジェクト/デキュメンテーション (XML だけでなく) を見た人はいますか?宣言的なスタイルを使用してタスクを実行します)。

私の研究のこの時点で、私はより多くの読み物と例を探しています。

4

4 に答える 4

7

最近、私は次のことを見ました。

よく読んでください:)

于 2009-12-10T21:43:28.413 に答える
2

C++ テンプレート プロセッサの使用に関する非常に優れた本があります。

Andrei Alexandrescu Modern C++ Design Generic Programming and Design Patterns Applied Addison-Wesley、USA、2001 ISBN 0-201-70431-5

アンドレイは、C++ テンプレートを使用してプログラムを書き始めます!

于 2009-12-10T22:43:36.590 に答える
1

テンプレートメタプログラミングは非常に強力なツールですが、物事は単純です。プロパティを記述するための独自の追加構文を考案する必要があります。

はい、C ++の解析困難ですが、必要な解析機能は限られています。階層情報を含むクラスリストと、シリアル化されたすべてのプロパティのリストを読み取ります。

これは、いくつかのダミーマクロを定義すれば、線形スキャンアルゴリズムを使用するC /C++ツールでも実行できます。

テンプレートはクラスのインスタンス化を抽象化でき、その上に侵入型RTTIを追加します。

テクニックの完全な説明は、この質問への私の答えに記載されています

C++でシリアル化を実装する方法

于 2012-04-26T12:16:00.057 に答える
0

Boost.Serializationが答えです。シリアル化カスタム型に必要なポータブル RTTI を導入します。

C++ のランタイム リフレクションについてはどうですか - それは別の質問です。

于 2011-04-22T10:34:09.753 に答える