[英]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.