型付き遺伝的プログラミングに似たものを実装していますが、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
を格納する templated があることに注意してください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 ++には型変数のサポートがないため、この問題をどのように実装できるか、または問題に対するまったく異なるアプローチを実装する方法はありますか?