首页 > 解决方案 > 将二进制节点类转换为非终端类

问题描述

我有一个类Binary_Node,它继承自一个抽象Node类。

class BinaryNode: public Node<BinaryNode>
{
public:
    // Constructor
    BinaryNode(int (*)(int, int));

    // Destructor
    ~BinaryNode();

    // Connectors
    void attach(std::vector<Node *>) override;

    // Function
    int (*function)(int, int);

    // Evaluation
    int evaluate() override;
};

它允许您附加其他二进制节点或计算为 int 的终端节点。方法实现如下。

#include "BinaryNode.h"

BinaryNode::BinaryNode(typed_value (*FUNCTION)(typed_value, typed_value)) : Node() {
    function = FUNCTION;
}

BinaryNode::~BinaryNode() = default;

void BinaryNode::attach(std::vector<Node *> CHILDREN) {
    children = CHILDREN;
}

int BinaryNode::evaluate() {
    return function(children[0]->evaluate(), children[1]->evaluate());
}

我最近在 C++17 中发现你可以做到

template<typename ... T>
bool compare(const char scope, T ... args) {
    return ((scope == args) || ...);
}

compare('a', 'b', 'c', 'd') // False
compare('a', 'b', 'c', 'a') // True

可以对我的班级做类似的事情,允许function评估尽可能多的孩子。就像是

template<typename ... T>
int BinaryNode::evaluate(T ... args) {
    return function(/*?*/);
}

通过将它从一个Binary_Node类转换为一个Nonterminal_Node类。

编辑:

我找到了一个很好的例子,说明我想要做什么以及如何完成它的堆栈溢出。本质上,它将 std::vector 扩展为参数包。现在我仍然需要找到一个虚拟模板成员函数的解决方法。

标签: c++variadic-templates

解决方案


取决于应该做什么评估,如果你想对返回的值求和,你可以覆盖 + 运算符并折叠它


推荐阅读