2

)

我想知道如何创建一个指向模板类的引用或指针,我不知道具体的模板参数类型。

例如我有

vector<int>   a;
vector<float> b;

现在我希望能够创建一个变量(在本例中为 c),它可以保存对 a 或 b 的引用或向量的任何其他特化,例如:

vector<>& c; // <- generic reference to all specializations of class vector<T>
c = a;
cout << c.size() << endl;

c = b;
cout << c.size() << endl;

我知道不可能调用 push_back 或任何其他接受或返回模板类型参数的操作,但我只想调用 size() 等不需要知识的方法具体的模板参数。

非常感谢您提前提供的帮助!

4

2 回答 2

4

那是做不到的。模板是编译器生成多个不相关类型的来源。如果您想创建通用代码,您可能会:

  • 为此使用类型擦除,尽管这可能不值得
  • 或者您可以编写与模板的不同特化相匹配的模板(它们本身会生成不同的功能,但您不必编写每一个)
  • 或者,如果您可以控制模板,则可以使用从基本类型的继承并将常用功能(所有专业化中存在且签名不变的功能)移动到基本类型
于 2013-06-28T21:22:22.850 回答
0

你想要的是运行时多态性。无论是否使用模板,在 C++ 中,这只能通过继承和虚拟方法来完成。

因此,您唯一的选择是创建一个基接口,然后创建一个继承基类的模板类。然后,您所有的专用类共享同一个继承类,您可以从中调用虚函数。

不幸的是,如果您无法控制模板化类,则无法使用此方法,vector例如引擎盖(类型擦除是一种“自动”执行此操作的提升模板化方式,但我宁愿在我的特定情况下自己编写类)。

我在这里的帖子可能会让你感兴趣。

于 2013-06-29T00:39:53.987 回答