【发布时间】:2020-02-09 00:45:59
【问题描述】:
我有两个类,比如“Base”和“Derived”,其中Derived 类继承Base 类。
然后是对派生类实例 (std::vector< std::reference_wrapper< Derived > > myContainer) 的引用容器。
最后,我有一个以std::vector< std::reference_wrapper< Base > > 作为参数的函数。
如果我将容器(myContainer)传递给函数,它不会编译:
如果我更改我的容器以保存对 Base 的引用,一切都会正常工作,并且因为它是一个 reference_wrapper,我相信,我仍然会有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会容纳除派生实例以外的任何东西。
同时,接受向量的函数应该适用于派生类和基类。
最少的代码:
#include <vector>
#include <functional>
class Base
{ /*some virtual stuff*/ };
class Derived : public Base
{};
void Fun( std::vector< std::reference_wrapper< Base > > const & container )
{}
int main()
{
std::vector< std::reference_wrapper< Derived > > myContainer;
Fun( myContainer ); // Error: no viable conversion
return 0;
}
直播代码:https://godbolt.org/z/SX5Gag
要求函数将派生引用的容器视为基本引用的向量的最佳方法是什么?
【问题讨论】:
-
典型的解决方案是:(a) 模板化你的函数
Fun;或 (b) 将“派生”向量复制到“基础”向量中。
标签: c++ stl type-conversion polymorphism reference-wrapper