树转换中模板与继承的结合 < >我把数据存储在C++树结构中,我从文件中读取数据。这棵树看起来像: class BaseNode { std::vector<BaseNode*> children_; ... }; class WhiteNode : public BaseNode { ... }; class BlackNode : public BaseNode { ... }; template <class T> T WhiteNode::Convert() { ... };
转换逻辑可以完全分开:树转换中模板与继承的结合 < >我把数据存储在C++树结构中,我从文件中读取数据。这棵树看起来像: class BaseNode { std::vector<BaseNode*> children_; ... }; class WhiteNode : public BaseNode { ... }; class BlackNode : public BaseNode { ... }; template <class T> T WhiteNode::Convert() { ... };,c++,templates,tree,polymorphism,type-erasure,C++,Templates,Tree,Polymorphism,Type Erasure,转换逻辑可以完全分开: 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(
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 ...");
}
虽然这个解决方案可行,但我相信它可以做得容易得多。我提出的任何其他更简单的解决方案都失败了,例如,由于类型擦除
如果能在这方面得到任何帮助,我将不胜感激。谢谢 类似于您的解决方案,但没有无效*
class NodeVisitor
{
virtual void VisitBlack(BlackNode* node);
virtual void VisitWhite(BlackNode* node);
};
class BaseNode {
std::vector<BaseNode*> children_;
...
virtual void visit(NodeVisitor* visitor) = 0;
};
class WhiteNode : public BaseNode {
virtual void visit(NodeVisitor* visitor) { visitor->visitWhite(this); }
};
class BlackNode : public BaseNode {
virtual void visit(NodeVisitor* visitor) { visitor->visitBlack(this); }
};
谢谢避免使用空指针可能会稍微优雅一些。然而,我正在寻找更紧凑的东西,可能没有转换或访问者类。这将是不完全可行的。你有C++11支持吗?是的,我有。如果有C++11解决方案,我会很好奇。我其实在期待一些类似CRTP的解决方案。但看看我的应用程序,我越来越倾向于坚持访问者模式。然而,任何其他观点都是非常受欢迎的。对于我的应用程序,访问者模式实际上是最合适的工具。我会坚持的。再次感谢您的提及。
BaseNode * node = new BlackNode;
std::cout << node->Convert<std::string>() << std::endl;
node = new WhiteNode;
std::cout << node->Convert<std::string>() << std::endl;
converting BLACK node to std::string ...
converting WHITE node to std::string ...
class NodeVisitor
{
virtual void VisitBlack(BlackNode* node);
virtual void VisitWhite(BlackNode* node);
};
class BaseNode {
std::vector<BaseNode*> children_;
...
virtual void visit(NodeVisitor* visitor) = 0;
};
class WhiteNode : public BaseNode {
virtual void visit(NodeVisitor* visitor) { visitor->visitWhite(this); }
};
class BlackNode : public BaseNode {
virtual void visit(NodeVisitor* visitor) { visitor->visitBlack(this); }
};
std::string convert(BaseNode* node)
{
class ConvertVisitor
: public NodeVisitor
{
ConvertVisitor(std::string* res)
: m_res(res)
{ }
virtual void VisitBlack(BlackNode* node)
{
*m_res = // convert black node to string;
}
virtual void VisitWhite(BlackNode* node)
{
*m_res = // convert white node to string;
}
std::string* m_res;
};
std::string res;
ConvertVisitor visitor(&res);
node->visit(&visitor);
return res;
}