2012-08-09 90 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) { 
     //... 
    } 
};