例如,考虑一个简单的数据结构,如链表。在 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);
}