saj*_*jas 5 c++ polymorphism stl type-conversion reference-wrapper
我有两个类,即“ Base”和“ Derived”,其中Derived类继承Base类。
然后是对派生类实例的引用的容器 ( std::vector< std::reference_wrapper< Derived > > myContainer)。
最后,我有一个作为std::vector< std::reference_wrapper< Base > >参数的函数。
如果我将容器(myContainer)传递给函数,它不会编译:
如果我更改容器来保存对 Base 的引用,一切都会正常工作,并且由于它是一个引用包装器,我相信,我仍然会具有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会容纳除派生实例之外的任何东西。
同时,接受向量的函数应该适用于派生类和基类。
最小代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
实时代码: https: //godbolt.org/z/SX5Gag
要求函数将派生引用的容器视为基引用的向量的最佳方法是什么?
这是不可能的:
std::vector< std::reference_wrapper< Derived > > d;
std::vector< std::reference_wrapper< Base > >& b = d;
Run Code Online (Sandbox Code Playgroud)
如果这是合法的,会发生什么?
SomeOtherDerivedClass o;
b.push_back(o); // sure, b is vector of Base, so legal
Run Code Online (Sandbox Code Playgroud)
但 b 实际上只是对 d 的引用,因此您只是设法将不同的非法类型放入 d 中。
因此,即使Base是 的基类Derived,也不适用于相应的容器,无论是它std::vector还是任何其他容器。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           864 次  |  
        
|   最近记录:  |