我想编写一些易于调用的对象初始化方法,我希望这些对象成为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(),这将需要结构/类,并且可能需要继承我的实际类吗?也许将其投射回父类? 可以肯定,这里有一些更优雅的东西。 ;-)
答案 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
继承,因为它没有虚拟析构函数。这也可能会限制这种方法的可用性。
除了样式之外,还有其他原因使您想要使用此表示法吗?