在编译时验证对象是否创建为shared_ptr

Verify at compile time that objects are created as shared_ptr

本文关键字:shared ptr 创建 是否 编译 验证 对象      更新时间:2023-10-16

我编写的一些类(通常作为boost::asio的一部分)的对象依赖于封装在shared_ptr中,因为它们使用shared_from_this()。如果对象没有在shared_ptr中实例化,有没有办法防止它被编译?

所以,我要找的是:

std::shared_ptr<MyClass> a = std::make_shared<MyClass>(); // should compile fine
std::unique_ptr<MyClass> a = std::make_unique<MyClass>(); // compile error
MyClass a; // compile error

将其构造函数设为私有,并为其提供一个创建shared_ptr的静态工厂成员函数。别忘了在评论中记录你的设计决定!

// Thing that foos the bar
struct Foo : std::enable_shared_from_this<Foo>
{
// Returns a shared_ptr referring to a new instance of Foo
static std::shared_ptr<Foo> CreateShared()
{
return std::shared_ptr<Foo>(new Foo);
}
private:
// To avoid bugs due to the shared_from_this base,
// we restrict Foo creation to being via CreateShared().
Foo() = default;
};

(我无法想象std::make_shared会因为私有ctor而工作,但你可以尝试一下。)

不过,我不得不说,这听起来不像是一个班级应该承担的责任。这是一种向后编程。

偷埃尔杰的话:

通常,如果对象包含在shared_ptr、堆、堆栈、指针、向量、数据成员或全局中,则最好(如果可能的话)对象不具有自我意识。一旦他们意识到自己的生命周期是如何管理的,他们就会变得更加受限。毫无必要。shared_from_this(可以说)是一种反模式。但是有时它可能是一种必要的反模式。

我更喜欢避免使用enable_shared_from_this,让人们使用他们认为合适的Foo,比如通过一个非常瘦的unique_ptr