我有两个类,例如“ 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
要求函数将“派生引用”容器作为“基本”引用向量的最佳方法是什么?
答案 0 :(得分:3)
那是不可能的:
std::vector< std::reference_wrapper< Derived > > d;
std::vector< std::reference_wrapper< Base > >& b = d;
如果这是合法的,会发生什么?
SomeOtherDerivedClass o;
b.push_back(o); // sure, b is vector of Base, so legal
但是b实际上只是对d的引用,因此您只是设法将另一个非法类型放入d。
因此,即使某些Base
是Derived
的基类,对于相应的容器(std::vector
或其他任何容器)也不会适用。