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
继承,因为它没有虚拟析构函数。这也可能会限制这种方法的可用性。
除了风格之外,还有什么原因让您想使用这种表示法吗?
我想编写一些易于调用的对象初始化,我希望这些对象成为 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
继承,因为它没有虚拟析构函数。这也可能会限制这种方法的可用性。
除了风格之外,还有什么原因让您想使用这种表示法吗?