将 std::reference_wrapper<Derived> 视为 std::reference_wrapper<Base> 的最佳方式
Best way to treat std::reference_wrapper<Derived> as std::reference_wrapper<Base>
我有两个class,比如'Base
'和'Derived
',其中Derived
class 继承Base
class.
然后是对 Derived class 实例 (std::vector< std::reference_wrapper< Derived > > myContainer
) 的引用的容器。
最后,我有一个以 std::vector< std::reference_wrapper< Base > >
作为参数的函数。
如果我将容器 (myContainer) 传递给函数,它不会编译:
如果我更改我的容器以保存对 Base 的引用,一切正常,因为它是一个 reference_wrapper,我相信,我仍然会有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会包含派生实例以外的任何东西。
同时,接受向量的函数应该在 Derived 和 Base classes 上工作。
最小代码:
#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
要求函数将派生引用的容器视为基引用的向量的最佳方法是什么?
那是不可能的:
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
的基础 class,同样不适用于相应的容器,无论是 std::vector
还是任何其他容器.
我有两个class,比如'Base
'和'Derived
',其中Derived
class 继承Base
class.
然后是对 Derived class 实例 (std::vector< std::reference_wrapper< Derived > > myContainer
) 的引用的容器。
最后,我有一个以 std::vector< std::reference_wrapper< Base > >
作为参数的函数。
如果我将容器 (myContainer) 传递给函数,它不会编译:
如果我更改我的容器以保存对 Base 的引用,一切正常,因为它是一个 reference_wrapper,我相信,我仍然会有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会包含派生实例以外的任何东西。
同时,接受向量的函数应该在 Derived 和 Base classes 上工作。
最小代码:
#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
要求函数将派生引用的容器视为基引用的向量的最佳方法是什么?
那是不可能的:
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
的基础 class,同样不适用于相应的容器,无论是 std::vector
还是任何其他容器.