c++在不知道其参数的情况下保留对模板实例的引用
c++ hold reference to template instance without knowing its arguments
)
我想知道如何创建指向模板类的引用或指针其中我不知道具体的模板参数类型。
例如,我有
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
),则不能使用此方法,因此在这种情况下,您无法做到这一点,除非构建一个提供常见行为并在后台执行强制转换的新类(类型擦除是一种"自动"实现这一点的增强模板化方法,但我宁愿在特定情况下自己编写该类)。
我在这里的帖子可能会引起你的兴趣。
相关文章:
- 对显式实例化的模板函数的未定义引用
- 重载运算符*以获取对另一个类的实例的引用
- 为什么我不能引用指向实例化对象的函数的指针?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- 将元组和整型实例合并到引用元组中
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- 为什么不能在实例化对基类的引用的同时实例化指向派生类的指针?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 超出返回引用的单一实例生存期
- 反向函数不反转类实例化的引用字符串
- 通过引用将私有类实例传递到另一个类 C++ 的"get"函数中
- 多个实例保存对unique_ptr的引用
- 类模板实例化和通用引用
- 对Singleton的未定义引用::实例
- 为构造函数初始化引用实例变量提供默认值
- 在其构造函数中引用实例