c ++在不知道其参数的情况下保持对模板实例的引用

时间:2013-06-28 21:09:09

标签: c++ templates

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

e.g。我有

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

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

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()等方法,而不是需要有关具体模板参数的知识。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

无法做到。模板是编译器将从中生成多个无关类型的源。如果您想创建通用代码,您可能会:

  • 使用类型擦除,虽然它可能不值得努力
  • 或者您可以编写匹配不同的模板 模板的特化(它们自己生成 不同的功能,但你不必写每一个)
  • 或者如果您控制模板,则可以使用基础继承 键入并移动常用功能(存在于所有功能中) 专业化并且签名不会改变到基础

答案 1 :(得分:0)

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

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

不幸的是,如果您不能控制模板化的类,例如vector,则无法使用此方法,因此在这种情况下您无法执行此操作,除非构建一个新的类提供了常见的行为并在引擎盖下执行施法(类型擦除是一种“自动”的提升模板方式,但我宁愿在我的具体情况下自己编写课程。)

我的帖子here可能会让您感兴趣。