Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类是这里的最佳选择吗?如果是,我该怎么做?_C++_Class_Templates_C++17 - Fatal编程技术网

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…
    +member
    F 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;
    }