Return 来自类构造函数调用的模板化智能指针

Return templated smart pointer from constructor-like calls

我想编写一些易于调用的对象初始化,我希望这些对象成为 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> 

我可以用函数解决这个问题:

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(),这需要一个 struct/class 并且可能继承我的实际 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;
};

这只是将构造函数的参数转发给make_shared函数,然后镜像智能指针的接口。 (此处您可能需要根据需要添加其他转发方式。)

有:

using Smart_MyClass = SharedWrapper<MyClass>;

你应该得到想要的行为,也可以将它用于不同的 类。

但是我看不出 Smart_MyClass 实际上是 std::shared_ptr<MyClass> 的任何可能性。不鼓励从 shared_ptr 继承,因为它没有虚拟析构函数。这也可能会限制这种方法的可用性。

除了风格之外,还有什么原因让您想使用这种表示法吗?