簡體   English   中英

處理 std::reference_wrapper 的最佳方法<derived>作為 std::reference_wrapper<base></derived>

[英]Best way to treat std::reference_wrapper<Derived> as std::reference_wrapper<Base>

我有兩個類,比如“ Base ”和“ Derived ”,其中Derived class 繼承了Base class。

然后是對 Derived class 實例的引用容器( std::vector< std::reference_wrapper< Derived > > myContainer )。

最后,我有一個 function 以std::vector< std::reference_wrapper< Base > >作為參數。

如果我將容器(myContainer)傳遞給 function,它不會編譯:

在此處輸入圖像描述

如果我改變我的容器來保存對 Base 的引用,一切都會正常工作,因為它是一個 reference_wrapper,我相信,我仍然會有我需要的多態行為。 但這感覺不干凈,因為我確信我的容器不會容納除派生實例之外的任何東西。

同時,接受向量的 function 應該適用於 Derived 和 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;
}

直播代碼: https://godbolt.org/z/SX5Gag

要求 Function 將派生引用的容器視為基本引用的向量的最佳方法是什么?

這是不可能的:

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的基礎 class ,同樣不適用於相應的容器,無論是std::vector還是任何其他容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM