【发布时间】:2014-10-19 15:54:08
【问题描述】:
我正在编写一个类ptr_scope_manager 来管理给定范围内指针的创建和销毁。我研究了这个问题的答案:
Private constructor inhibits use of emplace[_back]() to avoid a move
而且看来,如果我想管理其类具有 private 构造函数的对象的创建,我的内部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您应该能够选择要使用的方法。 -
@Joachim 这令人鼓舞,但我是 SFINAE 类型技巧的新手,我不知道如何进行。
-
只是一个问题:调用管理器的私有(静态)方法的私有自定义分配器不会在不需要 SFINAE 的情况下解决问题吗?这样就可以让 emplace 工作了。
标签: c++ templates c++11 sfinae