2012-08-09 135 views
1

我正在实现类似于类型化遗传编程的东西,并且对于C++类型已经变得有点卡住了。如何转换为变量类型 - 模拟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; 
    ... 
} 

注意我有一个模板FunctionalNode,其存储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 + +缺乏类型变量的支持,或完全不同的方法来解决这个问题?

+0

够公平的,告诉我在哪里可以改善和更精确。 – zenna 2012-08-09 19:48:19

+0

例如您可以提供一个最小编译代码示例,显示您不明白的具体错误或问题。 – TemplateRex 2012-08-09 21:52:57

回答

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) { 
     //... 
    } 
};