C++ 模板类是这里的最佳选择吗?如果是,我该怎么做?
我试图将函数指针作为参数包含在类构造函数中,以允许任何任意函数指针作为成员变量存储在类中。在代码示例中,这显示为C++ 模板类是这里的最佳选择吗?如果是,我该怎么做?,c++,class,templates,c++17,C++,Class,Templates,C++17,我试图将函数指针作为参数包含在类构造函数中,以允许任何任意函数指针作为成员变量存储在类中。在代码示例中,这显示为函数被分配给函数,该函数被传递到构造函数中,类型为类型化值(*)(类型化值,类型化值)。这里的typed\u value是一种std::variant。我希望这是任何类型的函数指针,例如 类型值(*)(类型值) 类型值(*)(类型值,类型值) 类型值(*)(类型值、类型值、类型值) 等等 下面的类继承自NodeExtended。我不觉得这个类的功能特别重要,但我很乐意根据请求添加它 #
函数
被分配给函数
,该函数被传递到构造函数中,类型为类型化值(*)(类型化值,类型化值)
。这里的typed\u value
是一种std::variant
。我希望这是任何类型的函数指针,例如
类型值(*)(类型值)
类型值(*)(类型值,类型值)
类型值(*)(类型值、类型值、类型值)
NodeExtended
。我不觉得这个类的功能特别重要,但我很乐意根据请求添加它
#pragma once
#include "NodeExtended.h"
#include <iostream>
class NonterminalNode: public NodeExtended<NonterminalNode>
{
public:
// Constructor
NonterminalNode(std::string, std::vector<std::string>, std::string, typed_value (*)(typed_value, typed_value));
// Destructor
~NonterminalNode();
// Connectors
void attach(std::vector<Node *>) override;
// Function type
typed_value (*function)(typed_value, typed_value);
// Evaluation
typed_value evaluate(reference_map_type & reference_map) override;
};
我的第一反应是模板化这个类,但是我收到了各种各样的错误。有没有人能给我介绍一下这个例子该怎么做,或者提出一个替代方案。比如说
#pragma once
#include "NodeExtended.h"
#include <iostream>
template <class arity>
class NonterminalNode: public NodeExtended<NonterminalNode<arity>>
{
public:
// Constructor
NonterminalNode(std::string, std::vector<std::string>, std::string, arity);
// Destructor
~NonterminalNode();
// Connectors
void attach(std::vector<Node *>) override;
// Function type
arity function;
// Evaluation
typed_value evaluate(reference_map_type & reference_map) override;
};
template <class arity>
inline
NonterminalNode<arity>::NonterminalNode(std::string NAME, std::vector<std::string> INPUT, std::string OUTPUT, arity FUNCTION) : NodeExtended(NAME, INPUT, OUTPUT) {
function = FUNCTION;
}
#pragma一次
#包括“NodeExtended.h”
#包括
模板
类NonterminalNode:public NodeExtended将这样的类转换为模板的解决方案有两个方面。它避免了关于继承的各种错误,并且没有出现字段名
#pragma once
#include "NodeExtended.h"
#include <iostream>
template <typename arity>
class NonterminalNode: public NodeExtended<NonterminalNode<arity>>
{
public:
// Constructor
NonterminalNode(std::string, std::vector<std::string>, std::string, arity);
// Destructor
~NonterminalNode();
// Connectors
void attach(std::vector<Node *>) override;
// Function type
arity function;
// Evaluation
typed_value evaluate(reference_map_type & reference_map) override;
};
template <typename arity>
NonterminalNode<arity>::NonterminalNode(std::string NAME, std::vector<std::string> INPUT, std::string OUTPUT, arity FUNCTION) : NodeExtended<NonterminalNode<arity>>(NAME, INPUT, OUTPUT) {
function = FUNCTION;
}
template <typename arity>
NonterminalNode<arity>::~NonterminalNode() = default;
template <typename arity>
void NonterminalNode<arity>::attach(std::vector<Node *> CHILDREN) {
this->children = CHILDREN;
}
template <typename arity>
typed_value NonterminalNode<arity>::evaluate(reference_map_type & reference_map) {
return function(this->children[0]->evaluate(reference_map), this->children[1]->evaluate(reference_map));
}
而不是
NonterminalNode<arity>::NonterminalNode(std::string NAME, std::vector<std::string> INPUT, std::string OUTPUT, arity FUNCTION) : NodeExtended(NAME, INPUT, OUTPUT) {
template <typename arity>
void NonterminalNode<arity>::attach(std::vector<Node *> CHILDREN) {
children = CHILDREN;
}
模板
无效非终端节点::附加(std::向量子节点){
儿童=儿童;
}
您是否考虑过通过让函数采用std::vector
或类似函数来规避此问题?@NicoSchertler我已经考虑过了,这将是我最后的选择。好建议。这也是需要进一步解决的问题,所以我试图避免它。有没有理由不定义一个类来采用template
,并按照MyClass(F,Args…
+memberF function(Args…)的思路使用构造函数
?这并不能真正解决具有动态签名的函数指针的核心问题。@NicoSchertler您能进一步说明吗?我的程序现在编译并运行得非常愉快。这对我很有效,但听起来你比我更有洞察力。@NicoSchertler也许你指的是extern“C”
函数,在这种情况下,我还没有完全克服这个障碍。据我所知,关键部分是非终端节点::evaluate
,其中使用不同数量的参数调用函数。不过,您回答了问题的另一部分(编译错误)。@NicoSchertler我有一个巧妙的解决方案,稍后我会添加它。
NonterminalNode<arity>::NonterminalNode(std::string NAME, std::vector<std::string> INPUT, std::string OUTPUT, arity FUNCTION) : NodeExtended<NonterminalNode<arity>>(NAME, INPUT, OUTPUT) {
NonterminalNode<arity>::NonterminalNode(std::string NAME, std::vector<std::string> INPUT, std::string OUTPUT, arity FUNCTION) : NodeExtended(NAME, INPUT, OUTPUT) {
template <typename arity>
void NonterminalNode<arity>::attach(std::vector<Node *> CHILDREN) {
this->children = CHILDREN;
}
template <typename arity>
void NonterminalNode<arity>::attach(std::vector<Node *> CHILDREN) {
children = CHILDREN;
}