2016-04-29 7 views
0

würde Ich mag einen Operator hinzufügen, um std :: unique_ptr, so kann ich make_unique hinzufügen, ohne make_unique zu Code hinzufügenÜberlastung unique_ptr Bedienerruf make_unique

ich möchte in der Lage sein, es zu tun, so etwas wie dieses

namespace Window 
{ 
    class CWindow; 

    typedef std::unique_ptr<CWindow> Window; 

    template<typename... Args> 
    Window::operator=(Args&&... args) 
    { 
     return std::make_unique<CWindow>(std::forward<Args>(args)...); 
    } 
} 

//global 
Window::Window MainWindow; 

//In WinMain 
MainWindow = Window::CWindow("Window Name", Vector2D(10, 10), Vector2D(500, 500)); 
+0

Warum nicht 'Vorlage Fenster CreateWindow (Ts && ... Args) {zurück make_unique (Std :: vorwärts (args) ...);}'? – Jarod42

+0

Weil das Hinzufügen von anderen Windows-Steuerelementen auf diese Weise Zeiger auf das Hauptfenster/die Registerkarten – koyesika

+0

hat 'operator =' akzeptiert nur ein Argument. Warum weist man 'unique_ptr', das mit' make_unique' erstellt wurde, nicht einfach 'MainWindow' zu? –

Antwort

2

Dies ist nicht möglich. operator= muss eine Mitgliedsfunktion sein, und Sie können Ihre eigenen Sachen der Klasse unique_ptr nicht hinzufügen.

Selbst wenn es möglich wäre, wäre es eine schlechte Idee, weil:

  • sie das Verhalten der gültigen Anwendungsfälle von operator= für unique_ptr
  • Leute den Code liest, wird nicht erwartet, dass dieses unerwartete Verhalten brechen

Sie konnte stammen aus unique_ptr und Überlastung operator= in der abgeleiteten Klasse, aber auch hier wird es co nfuse irgendjemanden, der den Code liest (einschließlich sich selbst wahrscheinlich, wenn Sie das Projekt nach einer Zeitperiode nochmals besuchten).

Wie in den Kommentaren vorgeschlagen, wäre es besser, nur einige benannte Funktion zu machen.

+0

'unique_ptr' ist eine Vorlage und Sie können Ihre eigene Teilspezialisierung hinzufügen, obwohl der Standard Sie in diesem Fall mit UB bedroht. – bipll

Verwandte Themen