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

The*_*ist 6 c++ shared-ptr boost-asio type-traits c++11

我编写的类(通常作为其中的一部分boost::asio),其对象依赖于shared_ptr因为它们使用而被包装在a中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
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 13

使其构造函数为私有,并为其提供一个静态工厂成员函数,用于创建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;
};
Run Code Online (Sandbox Code Playgroud)

(我无法想象std::make_shared由于私人ctor会有效,但你可以试试.)

不过,我必须说,这听起来并不像一个班级应该承担的责任.这是一种倒退的编程.

窃取Eljay:

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

我宁愿避免enable_shared_from_this并让人们使用你的,Foo但他们认为合适,例如通过一个很好的精益unique_ptr.