![]() |
赤紫蘇2.リファレンス |
||
aka:sequence メンバ定義(単純型) |
|||
akaxiso2.0-beta1 | |||
|
|||
aka:sequenceは、値クラスとして、メンバを定義できるクラスを用います。メンバが、aka:sequenceの子要素となります。 aka:sequenceを定義するleafクラスは、aka::sequence<>クラスを継承する必要があります。aka::sequence<>クラスの宣言は、以下のとおりです。 namespace aka { template<class T, class L = xiso::leaf<T> > class sequence; } class Tは、値クラスの型です。Lは、leafクラスであり、デフォルトとして、xiso::leaf<T>が割り当てられています。 struct fooには、std::string型のmember_ メンバがあります。これを、タグ名"member"でシリアライズするための実装例を以下に示します。struct foo のleafクラスを、struct leaf<foo> として定義します。このクラスは、aka::sequence<>を継承します。また、void leaf<foo>::model()メソッド内にて、タグ名"member"と、foo::member_を対応付けます。 struct foo { // (デ)シリアライズされるクラス std::string member_; }; namespace xiso { struct leaf<foo> : aka::sequence<foo> { void model() { member("member", &foo::member_,); }; 子要素の定義 model()メソッド内で、メンバ定義を行うために、以下に示す、struct memberを用います。このクラスのコンストラクタが、メンバ宣言に用いられます。 struct member { // コンストラクタ(1) template<class P, class V> member(const std::string &tagname, V P::* m); // コンストラクタ(2) template<class P, class V, class VL> member(const std::string &tagname, V P::* m, const VL&); // コンストラクタ(3) template<class P, class V> member(const std::string &tagname, V P::* m, int minOccurs, int maxOccurs); // コンストラクタ(4) template<class P, class V, class VL> member(const std::string &tagname, V P::* m, const VL&, int minOccurs, int maxOccurs); // デフォルト値指定 void set_default(const std::string &defval); }; コンストラクタ(1)は、一番基本的な書式です。tagnameでタグ名を指定し、mでメンバを定義します。 memberの指定に後続して、デフォルト値を設定できます。以下の例では、foo::member_メンバのデフォルト値として、"default string"を指定しています。 namespace xiso { struct leaf<foo> { void model() { member("member", &foo::member_,).set_default("default string"); }; } ポインタ型の使用 ポインタ型のメンバは、aka::deep_ptr<>によって、定義されるスマートポインタを用いて実装できます。 出現頻度は、自動的に、minOccurs=0, maxOccurs=1と限定されます。 ポインタ型のメンバには、struct ptrmemberを用います。 struct ptrmember { // コンストラクタ(1) template<class P, class V> ptrmember(const std::string &tagname, V P::* m); // コンストラクタ(2) template<class P, class V, class VL> ptrmember(const std::string &tagname, V P::* m, const VL&); }; コンストラクタ(1)では、第一引数は、タグ名、第二引数は、メンバへのポインタとなります。 固定値(fixed)の使用 固定値は、単純型要素の値を定数とし、指定された値以外の値がXML文書中に存在した場合、パースエラーとします。 固定値に対して、struct fixed_member<>テンプレートを用います。 template<class V> struct fixed_member { fixed_member(const std::string &tagname, const std::string &fixed_value); template<class VL> fixed_member(const std::string &tagname, const std::string &fixed_value, const VL &); }; aka:sequenceの値クラスには、固定値を収めるためのメンバを、定義する必要がありません。 固定値の配列の場合には、struct fixed_array<>テンプレートを用います。 struct fixed_array { template<class P, class V> fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m, int minOccurs, int maxOccurs); template<class P, class V, class VL> fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m, const VL &, int minOccurs, int maxOccurs); }; 固定値の配列の場合には、固定値として現れる子要素の数を収めるために、コンテナを使用します。コンテナ内部に保持されるインスタンスの個数が、固定値配列の要素数となります。 また、シリアライズ時には、配列中のインスタンスの値は、どのような値であっても、固定値で指定した値となります。デシリアライズ時には、固定値として指定された値を持つインスタンスが、子要素の出現個数分、格納されます。 |