5
ファイルから読み込んだC++ツリー構造でデータが格納されています。ツリーは次のようになります。ツリー変換でのテンプレートと継承の結合
class BaseNode {
std::vector<BaseNode*> children_;
...
};
class WhiteNode : public BaseNode { ... };
class BlackNode : public BaseNode { ... };
ツリーが作成されたら、それを変換します。文字列に変換する。ツリーノードがBaseNode*
として格納されているので、私ドン、
template <class T>
T WhiteNode::Convert() { ... };
しかし:変換コードから別のツリーのコードを保つために
、私はそのような何かを実装する、すなわちテンプレートを使用したいと思いますそのようなテンプレートメンバ関数にアクセスする方法はわかりません。テンプレートのメンバ関数は継承できないので、これはうまくいくとは思わない。私も実用的なソリューション、と思いついたの
:template <>
void * Conversion<std::string>::FromWhite() {
return new std::string("converting WHITE node to std::string ...");
}
template <>
void * Conversion<std::string>::FromBlack() {
return new std::string("converting BLACK node to std::string ...");
}
テストコード:
BaseNode * node = new BlackNode;
std::cout << node->Convert<std::string>() << std::endl;
node = new WhiteNode;
std::cout << node->Convert<std::string>() << std::endl;
戻り
class BaseConversion {
public:
virtual ~BaseConversion() {}
virtual void * FromBlack() = 0;
virtual void * FromWhite() = 0;
};
template <class T>
class Conversion : public BaseConversion {
public:
void * FromBlack();
void * FromWhite();
};
class BaseNode {
std::vector<BaseNode*> children_;
virtual void * Convert(BaseConversion * conversion) = 0;
public:
virtual ~BaseNode() {}
template <class T>
T Convert() {
return *static_cast<T*>(Convert(new Conversion<T>));
}
};
class WhiteNode : public BaseNode {
void * Convert(BaseConversion * conversion) {
return conversion->FromWhite();
}
};
class BlackNode : public BaseNode {
void * Convert(BaseConversion * conversion) {
return conversion->FromBlack();
}
};
そして、変換ロジックを完全に分離することができ期待される結果:
converting BLACK node to std::string ...
converting WHITE node to std::string ...
このソリューションは機能しますが、もっと簡単に行うことができます。私が思いついた他の単純な解決策は、失敗しました。タイプ消去のためです。
私はそのことについてお手伝いします。ありがとう!
感謝。 voidポインターを避ける方が少し優雅です。しかし、私はもっとコンパクトなものを探していました。おそらくコンバージョンやビジタークラスはありませんでした。 – DonDieselkopf
これは完全に実行可能ではありません。 C++ 11のサポートはありますか? –
はい、あります。 C++ 11のソリューションがあれば、私は興味があります。私は実際にCRTPのような解決策を期待していました。しかし、私のアプリケーションを見て、私はますます訪問者のパターンに固執するように誘惑されます。それにもかかわらず、他の意見は大歓迎です。 – DonDieselkopf