Template-Methode zur Auswahl zwischen Funktionen basierend auf der Zugänglichkeit des Konstruktors
Ich schreibe eine Klasseptr_scope_manager
die Erstellung und Zerstörung von Zeigern in einem bestimmten Bereich zu verwalten. Ich habe die Antworten auf diese Frage studiert:
Und es scheint, dass, wenn ich die Erstellung eines Objekts verwalten möchte, dessen Klasse ein hatPrivatgelände Konstruktor, mein internerstd::vector
Kann benutzenpush_back
aber nichtemplace_back
das Objekt zu konstruieren. Das ist weilemplace_back
Verwendet eine interne Klasse, um das Objekt zu konstruieren. Das heißt, die befreundetptr_scope_manager
reicht nicht aus, um Objekte mit privaten Konstruktoren zu erstellen.
Also habe ich zwei gemachtcreate
Methoden, eine für Objekte mit öffentlichen Konstruktoren und eine für Objekte mit privaten Konstruktoren, die die befreundet habenptr_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);
}
Meine Frage lautet:
Gibt es eine Möglichkeit, mit SFINAE (oder auf andere Weise?) Automatisch zwischen auszuwählencreate_public()
undcreate_private()
basierend darauf, ob die VorlageType
Parameter hat einen öffentlichen oder privaten Konstruktor? Vielleicht nutzenstd::is_constructible
?
Es wäre schön, nur einen zu habencreate()
Methode, die die effizientere automatisch auswähltcreate_public()
Methode, wo möglich und auf die etwas weniger effiziente zurückgreifencreate_private
wenn nötig.