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

c++ hold reference to template instance without knowing its arguments

本文关键字:引用 实例 保留 情况下 不知道 参数 c++      更新时间:2023-10-16

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

例如,我有

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;

我知道这样一个事实,即不可能调用pushback或任何其他接受或返回模板化类型参数的操作,但我只想调用size()等不需要了解具体模板参数的方法。

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

这是不可能的。模板是编译器生成多个不相关的类型的来源。如果你想创建通用代码,你可以潜在地:

  • 为此使用类型擦除,尽管这可能不值得
  • 或者您可以编写与不同模板的专业化(其自身将生成不同的函数,但不必编写每一个)
  • 或者,如果您控制模板,则可以使用从基继承键入并移动通用函数(所有专门化,签名不变)

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

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

不幸的是,如果您不能控制模板化类(如vector),则不能使用此方法,因此在这种情况下,您无法做到这一点,除非构建一个提供常见行为并在后台执行强制转换的新类(类型擦除是一种"自动"实现这一点的增强模板化方法,但我宁愿在特定情况下自己编写该类)。

我在这里的帖子可能会引起你的兴趣。