我有两个类,例如'Base'和'Derived',其中Derived类继承了Base类。

然后是一个对派生类实例(std::vector< std::reference_wrapper< Derived > > myContainer)的引用容器。

最后,我有一个将std::vector< std::reference_wrapper< Base > >作为参数的函数。

如果我将container(myContainer)传递给函数,它将无法编译:

c&#43;&#43; - 将std::reference_wrapper &lt;Derived&gt;视为std::reference_wrapper &lt;Base&gt;的最佳方法-LMLPHP

如果我更改容器以保存对Base的引用,则一切正常,并且由于它是reference_wrapper,我相信,我仍将具有所需的多态行为。但这感觉很不干净,因为我敢肯定我的容器除了派生实异常(exception)不会容纳任何东西。

同时,接受 vector 的函数应该在派生类和基类上都可以使用。

最小代码:

#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

要求函数将派生引用的容器视为基本引用的 vector 的最佳方法是什么?

最佳答案

那是不可能的:

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中。

因此,即使BaseDerived的基类,即使它是std::vector或其他任何容器,也不会适用于相应的容器。

10-04 12:59
查看更多