我正在编写一个名为
ptr_scope_manager
的类来管理给定范围内指针的创建和销毁。我研究了这个问题的答案:私有构造函数阻止使用emplace[_back]()以避免移动,发现如果我想管理一个具有私有构造函数的对象的创建,我的内部std::vector
可以使用push_back
而不是emplace_back
来构造该对象。这是因为emplace_back
使用内部类来构造对象。这意味着让ptr_scope_manager
成为友元并不足以允许它创建具有私有构造函数的对象。所以我做的是制作两个create
方法,一个用于具有公共构造函数的对象,另一个用于具有已成为ptr_scope_manager
友元的私有构造函数的对象。template<typename Type>
class ptr_scope_manager
{
private:
std::vector<Type> ptrs;
public:
template<typename... Args>
Type* create_private(Args... args)
{
ptrs.push_back(Type(args...));
return &ptrs.back();
}
template<typename... Args>
Type* create_public(Args... args)
{
ptrs.emplace_back(args...);
return &ptrs.back();
}
};
class public_ctor
{
int i;
public:
public_ctor(int i): i(i) {} // public
};
class private_ctor
{
friend class ptr_scope_manager<private_ctor>;
int i;
private:
private_ctor(int i): i(i) {} // private
};
int main()
{
ptr_scope_manager<public_ctor> public_manager;
ptr_scope_manager<private_ctor> private_manager;
public_manager.create_public(3);
public_manager.create_private(3);
// private_manager.create_public(3); // compile error
private_manager.create_private(3);
}
我的问题是:
是否可以使用SFINAE(或其他方式)根据模板参数Type
的构造函数公有或私有来自动选择create_public()
和create_private()
之间的关系?也许可以利用std::is_constructible
?
如果可能的话,只需要一个create()
方法即可自动选择更高效的create_public()
方法,并在必要时回退到稍微低效的create_private()
。
std::is_constructible
和std::enable_if
,您应该能够选择要使用的方法。 - Some programmer dude