c++ - 将 std::reference_wrapper<Derived> 视为 std::reference_wrapper<Base> 的最佳方式

标签 c++ stl type-conversion polymorphism reference-wrapper

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

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

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

如果我将容器 (myContainer) 传递给函数,它不会编译:

enter image description here

如果我更改我的容器以保存对 Base 的引用,一切正常,并且因为它是一个 reference_wrapper,我相信,我仍然会拥有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会包含派生实例以外的任何东西。

同时,接受 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

要求 Function 将 Derived 引用的容器视为 Base 引用的 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 或任何其他代码。

关于c++ - 将 std::reference_wrapper<Derived> 视为 std::reference_wrapper<Base> 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58342108/

相关文章:

c++ - 在 OpenMP for 循环中更新 HashMap

c++ - 计算文件中的 react 数

c++ - 未解析的外部符号 - 静态

c++ - C++ STL 中 hash_set::size() 的复杂性是多少?

c++ - 不明确的转换 - C++

c++ - C++中的默认构造函数

c++ - 从函数返回 STL 对象而不触发 move

c++ - 为什么我不能将函数指针作为模板参数传递给 map ?

c++ - 从 double 转换到 size_t 会产生错误的结果?

c# - 是否有任何通用的 Parse() 函数可以使用解析将字符串转换为任何类型?