5

Gibt es eine Möglichkeit, einen Mitgliedsfunktionszeiger auf den Kopierkonstruktor einer Klasse zu bekommen? Ich weiß, wie man einen normalen Mitgliedfunktionszeiger definiert und benutzt, aber ich kann nicht scheinen, einen Weg zu finden, es zu erhalten.Wie kann ich einen Mitgliedsfunktionszeiger auf den Kopierkonstruktor einer Klasse erhalten?

+5

Sie können nicht. Konstruktoren haben keine Namen. –

+0

Sie können nicht, aber je nachdem, was Sie tun möchten, können Sie möglicherweise eine Problemumgehung mit einem Lamda finden. I.e. legte es in die Lamda. – Makaronodentro

+8

Das klingt wie ein [XY-Problem] (http://xyproblem.info/). Angenommen, Sie haben es irgendwie geschafft, einen Zeiger auf einen Konstruktor zu bekommen (was nicht möglich ist) - wie würden Sie ihn verwenden? Was ist das eigentliche Problem, das Sie versuchen zu lösen? –

Antwort

3

Gemäß dem C++ - Standard darf "die Adresse eines Konstruktors nicht vergeben werden", also ist es einfach nicht möglich, das zu tun, was Sie fragen. Es gibt jedoch eine einfache Problemumgehung. Der folgende Code gibt einen Funktionszeiger an eine Funktion zurück, die eine Kopie ihrer Eingabe erstellt.

template<class obj> auto GetCopyConstructor() -> obj(*)(const obj&) 
{ 
    return +[](const obj& o) { return obj(o); }; 
}  
struct foo 
{ 
    std::string msg; 
    foo(const std::string& my_msg) { msg = my_msg; } 
    foo(const foo&) = default; 
}; 
int main() 
{ 
    auto make_copy = GetCopyConstructor<foo>(); 
    foo a("Hello, world"); 
    foo b = make_copy(a); 
    std::cout << b.msg << std::endl; 
} 

Alternativ: (Eine Vereinfachung, die auch zusätzliche Anwendungsfälle abdeckt)

template<class obj> obj Copy(const obj& o) { return obj(o); } 
template<class obj> obj* CopyNew(const obj& o) { return new obj(o); } 
template<class obj> obj CopyFromPtr(const obj* o) { return obj(*o); } 
template<class obj> obj* CopyNewFromPtr(const obj* o) { return new obj(*o); } 
template<class obj> void* WhyWouldYouEvenWantToDoThis(const void* o) 
{ return new obj(*(obj*)o); } 
int main() 
{ 
    foo(*make_copy)(const foo&) = Copy<foo>; 
    foo a("Hello, world"); 
    foo b = make_copy(a); 
    std::cout << b.msg << std::endl; 
} 
+0

Die einzigen fehlenden Zeilen sind #include und #include , und der Code funktioniert in C++ 11 und C++ 14 mit dem GCC-Compiler. Welche Probleme haben Sie? –

+0

[Niemals] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-scorery-is-this). Heute etwas Neues gelernt. – StoryTeller

+0

Das + sollte nicht notwendig sein, nicht sicher, warum es da ist? Es sollte eine implizite Konvertierung bei der Rückgabe auslösen, ohne es gut zu machen. –

Verwandte Themen