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?
Antwort
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;
}
Die einzigen fehlenden Zeilen sind #include
[Niemals] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-scorery-is-this). Heute etwas Neues gelernt. – StoryTeller
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. –
- 1. Wie übergeben Sie einen Mitgliedsfunktionszeiger?
- 2. Wie Aufruf Basisklasse Kopierkonstruktor von einer abgeleiteten Klasse Kopierkonstruktor?
- 3. Wie durch einen Mitgliedsfunktionszeiger aufrufen?
- 4. Wie ruft man einen Parameterkonstruktor einer Klasse auf, die einen Kopierkonstruktor als privat enthält, in C++?
- 5. Wie Vorlage-Klasse mit Mitgliedsfunktionszeiger erstellen?
- 6. Kann ich in C# einen Kopierkonstruktor erstellen, der von einer abgeleiteten Klasse kopiert?
- 7. Vererben von einer Klasse, die den Kopierkonstruktor gelöscht hat
- 8. Wie kann ich '=' einen Kopierkonstruktor in Perl aufrufen lassen?
- 9. Wie erkennt Qt Mitgliedsfunktionszeiger?
- 10. So definieren Sie einen allgemeinen Mitgliedsfunktionszeiger
- 11. So initialisieren Sie einen AWL-Vektor/eine Liste mit einer Klasse, ohne den Kopierkonstruktor aufzurufen
- 12. Warum ruft das den Kopierkonstruktor auf, nicht den Move-Konstruktor?
- 13. Wie kann ich einen Wert in die Klasse von einer anderen Klasse erhalten
- 14. Einen Funktionszeiger im Kopierkonstruktor neu binden
- 15. Std :: Karte der Mitgliedsfunktionszeiger?
- 16. Memberfunktionszeiger ruft Kopierkonstruktor auf?
- 17. Wie kann ich den Namen einer Klasse zu erhalten, mit einer statischen Methode (nicht mit Exception)
- 18. Wie rufe ich einen Mitgliedsfunktionszeiger mit einem Zeiger auf ein konstantes Objekt auf?
- 19. Wie erzwinge ich, dass der Compiler den expliziten Kopierkonstruktor verwendet?
- 20. Ist es sicher, einen Mitgliedsfunktionszeiger auf eine andere Klasse und wieder zurück zu werfen?
- 21. Wie kann ich den Anfangswert einer ComboBox erhalten?
- 22. Wie kann ich einen eindeutigen Index für jede Instanz einer Klasse in Android erhalten?
- 23. Wie kann ich in css den Hintergrund einer Klasse auf none setzen und gleichzeitig den Hintergrund einer anderen Klasse beibehalten?
- 24. Wie kann ich den JFrame von einer anderen Klasse aufrufen?
- 25. Wie kann ich einen Eingabewert in einer URL erhalten?
- 26. Wie kann ich einen Druckergerätekontext erhalten?
- 27. Wie kann ich den Akkustatus einer Magic Mouse erhalten? (in%)
- 28. Wie erhalten Sie einen Verweis auf die umschließende Klasse von einer anonymen inneren Klasse in Java?
- 29. Wie kann ich den generischen Typ einer Abstracts-Klasse erfassen?
- 30. Bedingter Operator kann überladene Mitgliedsfunktionszeiger nicht lösen
Sie können nicht. Konstruktoren haben keine Namen. –
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
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? –