タイプ T のデータを返すテンプレート Node があります。
template <class T> Node
{
public:
virtual const T& GetData() = 0;
};
そして、データへのポインターと実際のデータを含む派生クラス RefNode と ValueNode が必要です。データのコピーを操作するか、ノード内の実際のデータを操作するかを選択できるようにします。
template<class T> class RefNode : public Node<T>
{
public:
RefNode(T *_data) : data(_data) { }
const T& GetData() { return *data; }
protected:
DataType *data;
};
template<class T> class ValueNode : public Node<T>
{
public:
ValueNode(const T&_data) : data(_data) { }
const T& GetData() { return data; }
protected:
T data;
};
テンプレートが仮想メソッドを持つことができないことは知っていますが、得たい効果を説明したかっただけです。私が得たかった効果は次のとおりです。
// クラス Vector 用
Vector v, *c;
c = new Vector();
Node<Vector>* node = new RefNode<Vector>(c);
Node<Vector>* node2 = new ValueNode<Vector>(a);
node2->GetData(); //calls ValueNode<Vector>'s GetData();
node->GetData(); //calls RefNode<Vector>'s GetData();
C++ でこの種の動作を実現する方法はありますか?
編集:
GetData() を次のように使用します。
Vector *vecarr[9];
Node<Vector>* nodes[10];
nodes[0] = new RefNode<Vector>(vecarr[0]);
nodes[1] = new ValueNode<Vector>(Vector(2,3)); //non reference vector
nodes[2] = new RefNode<Vector>(vecarr[1]);
nodes[3] = new RefNode<Vector>(vecarr[2]);
.....
void processPositionNodes(Node<Vector> **nodes, int n)
{
for(int i=0; i< n; i++) //iterate over all nodes
{
Vector vec = nodes[i]->GetData();
//do something with vec
}
}
ノードに含まれるデータのタイプを変更できるようにしたいのは、さまざまなタイプのデータ (ベクトル、スカラーなど) を処理するいくつかのグラフ アルゴリズムを実装したいからです。