XML Schema Part2: Datatypes にはさまざまな SimpleType が定義されているわけですが、これをそれぞれC++の型(クラス)として扱うことを考えます。これにより、或る XML データベースに対する問い合わせの結果セットを、それぞれの要素や属性の値をプロパティとして持つデータクラスのコレクションとして扱えるようになるはず。
XML 文書として入出力することを考え、各クラスは、文字列型での入出力関数を備えることとします。すると各プロパティクラスの基底クラス XSDBaseType は以下のようになります。
class XSDBaseType {
virtual void fromString( std::string src ) = 0;
virtual std::string toString() const = 0;
};
これをそれぞれの SimpleType に合わせて継承するわけですが、Type によって全然動きが違うので、いちいち継承してたら継承階層が広くなるのが使いにくそう。
そこで、 template を使ってみることにします。
template<typename T>
class XSDType : public XSDBaseType {
public:
XSDType();
~XSDType();
void fromString( std::string src ) {
rawdata = source;
}
std::string toString() const {
return rawdata;
}
T& getRaw() const { return rawdata; }
void setRaw( const T& data ) { rawdata = T; }
private:
T rawdata;
};
上記のように、XSDType を定義し、それぞれの SimpleType が内部で持つべき C++ 型に合わせて特殊化します。
template<> XSDType<bool>::fromString( std::string source )
{
if ( source == "true" || source == "1" ) {
rawdata = true;
} else {
rawdata = false;
}
}
template<> std::string XSDType<bool>::toString()
{
if ( rawdata ) {
return "true";
} else {
return "false";
}
}
あとは、typedef しておけばサクサク使える。
typedef XSDType<bool> XsBoolean;
なんでこんなことをしているのかというと、要素名から自動的に自分の型を判別してデータクラスに保持することがやりたいので。その辺は次回時間があったら。
過去の雑記
話題別ピックアップ
ご意見、ご感想などありましたら、お気軽にメールください。
© 2001-2002 源三郎 parasa@lares.dti.ne.jp