gpt4 book ai didi

c++ - 在树转换中结合模板和继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:43 25 4
gpt4 key购买 nike

我将数据存储在从文件中读取的 C++ 树结构中。这棵树看起来像这样:

class BaseNode {
std::vector<BaseNode*> children_;
...
};
class WhiteNode : public BaseNode { ... };
class BlackNode : public BaseNode { ... };

树建成后,我想转换它,例如到一个字符串。

为了将树代码与转换代码分开,我想使用模板,即实现类似的东西:

template <class T>
T WhiteNode::Convert() { ... };

但是,由于树节点存储为BaseNode*,我不知道如何访问这样的模板成员函数。由于无法继承模板成员函数,因此我认为这行不通。

不过,我确实想出了一个可行的解决方案:

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();
}
};

并且转换逻辑可以完全分开:

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;

返回预期结果:

converting BLACK node to std::string ...
converting WHITE node to std::string ...

虽然这个解决方案有效,但我相信它可以更容易地完成。我想出的任何其他更简单的解决方案都失败了,例如由于类型删除。

我将不胜感激任何帮助。谢谢!

最佳答案

类似于您的解决方案但没有 void*。

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;
}

关于c++ - 在树转换中结合模板和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com