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:

Der private Konstruktor verhindert die Verwendung von emplace [_back] (), um einen Umzug zu vermeiden

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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage