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;
   ...
}

FunctionalNodeを格納する templated があることに注意してくださいstd::function。代わりにプレーンな関数ポインタを格納する場合、私の問題は同様に適用されると思います (ただし、確かではありません)。

したがって、問題は、Nodedervied へのポインターが与えられたある時点で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 に答える