将二进制节点类转换为非终端类

问题描述 投票:2回答:1

我有一个名为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类。

编辑:

我在堆栈溢出中找到了一个很好的例子,它说明了我想做什么以及如何完成它。 Essentially it's expanding std::vector into a parameter pack。现在,我仍然需要找到虚拟模板成员函数的解决方法。

c++ variadic-templates
1个回答
0
投票

取决于应该执行的评估,如果要对返回的值求和,可以覆盖+运算符并对其进行折叠

© www.soinside.com 2019 - 2024. All rights reserved.