![]() |
赤紫蘇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);
};
固定値の配列の場合には、固定値として現れる子要素の数を収めるために、コンテナを使用します。コンテナ内部に保持されるインスタンスの個数が、固定値配列の要素数となります。 また、シリアライズ時には、配列中のインスタンスの値は、どのような値であっても、固定値で指定した値となります。デシリアライズ時には、固定値として指定された値を持つインスタンスが、子要素の出現個数分、格納されます。 |
|||
