从类似构造函数的调用中返回模板化的智能指针

时间:2019-10-16 12:08:44

标签: c++ templates constructor smart-pointers

我想编写一些易于调用的对象初始化方法,我希望这些对象成为MyClass的shared_ptr。

仅出于可视化目的,请想象一下此类:

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(),这将需要结构/类,并且可能需要继承我的实际类吗?也许将其投射回父类? 可以肯定,这里有一些更优雅的东西。 ;-)

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

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继承,因为它没有虚拟析构函数。这也可能会限制这种方法的可用性。

除了样式之外,还有其他原因使您想要使用此表示法吗?