簡體   English   中英

從類似構造函數的調用中返回模板化智能指針

[英]Return templated smart pointer from constructor-like calls

我想寫一些易於調用的 object 初始化,我希望這些對象是 MyClass 的 shared_ptr。

僅出於可視化目的,想象一下這個 class:

class MyClass
{
public:
  MyClass(int number);
  MyClass(wxString path);
}

int main()
{
  //For now, objects are created in c style like this:
  MyClass obj1("C:\\test");
  MyClass * obj2 = new MyClass(5);
}

現在我想用易於使用的智能指針初始化來改變它。 我的目標是看起來像構造函數調用,因此只需很少更改即可將舊調用更新為新調用:

Smart_MyClass obj1("C:\\test");
Smart_MyClass obj2(5);
//where Smart_MyClass is std::shared_ptr<MyClass> 

我可以用 function 解決這個問題:

template<typename T>
inline Smart_MyClass Smart_MyClass_Fct(T t)
{
    return std::make_shared<MyClass>(t);
};

Smart_MyClass obj = Smart_MyClass_Fct(7);

我怎樣才能把它翻譯成我需要的形式? 我可以考慮使用 operator(),這將需要一個結構/類,並且可能需要繼承我的實際 class? 也許將其轉換回父 class? 很肯定有更優雅的東西。 ;-)

您可以嘗試以下方法:

template<typename T>
class SharedWrapper
{
public:
    template<typename... Args>
    SharedWrapper(Args... args) : 
        m_p{std::make_shared<T>(std::forward<Args>(args)...)}
    { }

    T& operator*() const noexcept { return *m_p; }
    T* operator->() const noexcept { return m_p.operator->(); }
    explicit operator bool() const noexcept { return static_cast<bool>(m_p); }

private:
    std::shared_ptr<T> m_p;
};

這只是將構造函數的 arguments 轉發給make_shared函數,然后鏡像智能指針的接口。 (在這里您可能需要根據需要添加其他轉發方法。)

和:

using Smart_MyClass = SharedWrapper<MyClass>;

您應該獲得所需的行為,也可以將其用於不同的類。

但是,我認為Smart_MyClass實際上沒有任何可能成為std::shared_ptr<MyClass> 不鼓勵從shared_ptr繼承,因為它沒有虛擬析構函數。 這也可能會限制這種方法的可用性。

除了風格之外,還有什么理由讓你想使用這個符號嗎?

暫無
暫無

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

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