Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
树转换中模板与继承的结合 < >我把数据存储在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 - Fatal编程技术网

树转换中模板与继承的结合 < >我把数据存储在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;
}