例として、リンクリストのような単純なデータ構造を考えてみましょう。Cでは、次のようになります。
struct Node
{
struct Node *next;
void *data;
};
void *getLastItem(struct Node*);
...
同じ構造体と関数が欲しいのですが、data
フィールドの型を宣言することで型チェックを改善します。これは常に何かへのポインタになります。使用例:
Node<Thing*> list = getListOfThings();
Thing *t = list->data;
t = getLastItem(list);
...
しかし、通常のテンプレートのように、すべてのタイプのポインターの実装を生成したくありません。言い換えれば、Java、ML、およびその他の言語の汎用型またはパラメトリック型のようなものが必要です。テストとして以下のコードを試しました。型指定されていないCのような部分は、最終的には実装ファイルに入れられますが、テンプレートと関数の宣言はヘッダーファイルに入れられます。それらが最適化され、タイプチェックされることを除いて、Cバージョンとほぼ同じマシンコードが残されると思います。
しかし、私はC ++が得意ではありません...これを改善する方法、またはより慣用的なC ++、おそらくテンプレートの特殊化を使用する方法はありますか?
#include <stdio.h>
struct NodeImpl
{
NodeImpl *next;
void *data;
};
void *getLastItemImpl(NodeImpl *list)
{
printf("getLastItem, non-template implementation.\n");
return 0; // not implemented yet
}
template <typename T>
struct Node
{
Node<T> *next;
T data;
};
template <typename T>
T getLastItem(Node<T> *list)
{
return (T)getLastItemImpl((NodeImpl*)list);
}
struct A { };
struct B { };
int main()
{
Node<A*> *as = new Node<A*>;
A *a = getLastItem(as);
Node<B*> *bs = new Node<B*>;
B *b = getLastItem(bs);
}