簡體   English   中英

是否可以使 shared_ptr 協變?

[英]Is it possible to make shared_ptr covariant?

我嘗試制作以下示例。

struct BaseSPtr{};
struct DerivedSPtr : public BaseSPtr{};


class Base{
    public:
    //virtual shared_ptr<BaseSPtr> function();
    virtual BaseSPtr* function();    
};

class Derived : public Base
{
    public:
    //shared_ptr<DerivedSPtr> function() override;
    DerivedSPtr* function() override;
};

有人可以告訴我是否可以使帶有shared_ptr的示例有效?

不幸的是,不,協方差僅適用於 C++ 中的指針和引用。

要擁有類似的界面,您必須執行以下操作:

class Base{
public:
    std::shared_ptr<BaseSPtr> function() { return std::shared_ptr<BaseSPtr>(function_v()); }
private:
    virtual BaseSPtr* function_v();
};

class Derived : public Base
{
public:
    std::shared_ptr<DerivedSPtr> function() // Hides Base::function
    {
        return std::shared_ptr<DerivedSPtr>(function_v());
    }
private:
    DerivedSPtr* function_v() override; // Overrides Base::function_v
};

CRTP 可能有助於減少重復。

現在的問題是你如何使用Derived類?

  • 您是否明確使用它並且不執行多態調用function()
  • 或者您是否將這個工廠保存在某個存儲中,並且以多態方式調用function()
  • 或者你在一些模板中使用它嗎

在第一種情況下,只需提供具有不同名稱的函數,然后您可以在需要派生類的指針時調用此函數。

在第二種情況下,您不應該嘗試說服編譯器您返回派生類,因為多態調用無論如何都會隱藏它。

在最后一種情況下,只需將 CRTP 用作其他建議的答案(有些人稱之為靜態多態性)並刪除 virtual 關鍵字。

暫無
暫無

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

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