Mar 1, 2017

[C++] Enabling make_unique with Private Constructors

Enabling make_unique with Private Constructors

Quote from 'STL':
That's not actually sufficient, since it's possible to have an omniconvertible X with an implicit conversion to Y, returning Y{}.
One way to really lock this down is to give Z a templated ctor, enabled only when the tag is Y.


class Test  
{
  struct _constructor_tag { explicit _constructor_tag() = default; };  // As 'STL' mentioned, this should't be just empty default constructor since client can init. with {}.

public:  
  Test(_constructor_tag) {}

  static unique_ptr<Test> factory()
  {
    return make_unique<Test>(_constructor_tag{});
  }
};

void test()  
{
  auto t1 = Test::factory(); // GOOD
  // auto t2 = make_unique<Test>(); // ERROR
  // auto t3 = make_unique<Test>()(Test::_constructor_tag); // ERROR
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.