我有一个名为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。现在,我仍然需要找到虚拟模板成员函数的解决方法。
取决于应该执行的评估,如果要对返回的值求和,可以覆盖+运算符并对其进行折叠