1

我正在实现类似于类型化遗传编程的东西,并且在 C++ 类型方面有点卡住了。

我有一个节点网络,节点有不同的类型,例如一些是功能节点,而另一些只是数据。为了处理此类节点的集合,除了使用多态性来存储基类指针的集合之外,我别无选择。

class Node {
private:
    std::string label;
    std::string node_type;
};

template
<typename FNC>
class FunctionalNode : public Node {
    std::function<FNC> function;
};

class Network {
   std::vector<Node*> nodes;
   ...
}

注意我有一个 templated FunctionalNode,它存储 a std::function,我认为(但不确定)如果我要存储一个普通的函数指针,我的问题同样适用。

所以问题是,在某些时候给定一个Node指向 dervied的指针FunctionalNode,我需要将存储的函数应用于某些值。这意味着我需要将基指针转换为派生类,但由于它是模板化的,我不确定如何执行此操作。

我想做类似下面的假 C++ 代码,它需要类型变量之类的东西:

Node * applyfunction(Node * functional_node, std::vector<Node*> arguments) {
    typevariable function_type = convert_node_type_to_typevariable(functional_node.node_type)
    functional_node_derived * = static_cast<function_type>(functional_node);
    ....
}

节点node_type是我用来包含节点类型信息的某种结构,例如它的函数形式的类型,并将其convert_node_type_to_typevariable转换为我可以在这个假设的 C++ 语言中使用的类型变量。

由于 C++ 缺乏对类型变量的支持,或者完全不同的解决问题的方法,我有什么想法可以实现这种设置吗?

4

1 回答 1

2

你应该利用你的多态结构。您可以Node使用纯虚方法定义而不是创建applyfunction自由函数。

class Node {
protected:
    std::string label;
    std::string node_type;
public:
    virtual ~Node () {}
    virtual Node * applyfunction (std::vector<Node *> args) = 0;
};

然后你的推导将执行这项工作。

template
<typename FNC>
class FunctionalNode : public Node {
    std::function<FNC> function;
public:
    Node * applyfunction (std::vector<Node *> args) {
        //...
    }
};
于 2012-08-09T14:18:17.797 回答