Ich habe eine Template-Funktion, die Funktionsobjekte empfängt. Manchmal sind die Funktionsobjekte statusfreie Strukturen, aber manchmal sind sie große zustandsbehaftete Objekte. Der Status des Funktionsobjekts wird in dieser Funktion nicht verändert, sondern nur geprüft. Ich bin auch sehr daran interessiert, Code zu schreiben, den der Compiler so weit wie möglich optimieren kann. Was sollte ich bei der Auswahl des Argumenttyps beachten?Was ist der korrekte Argumenttyp für ein Funktionsobjekt?
Die Funktion ist von dieser Art:
template<typename funcT>
auto make_particle(funcT fun) {
Particle<typename funcT::result_type> particle;
particle = fun();
return particle;
}
Das Argument Typ wahrscheinlich funcT const & fun
sein sollte, so dass die großen Objekte nicht kopiert werden, aber warum die meisten Menschen Objekte Call-by-Value-Funktion verwenden? Verliere ich etwas durch Verwendung von const Referenz? Oder sollte ich Lvalue-Referenz verwenden? Bitte beachten Sie, dass C++ 1y in Ordnung ist und dass das obige Codebeispiel nur ein Beispiel ist.
Sie können beide Fälle mit einem einzigen Referenzparameter lösen - T &&, auch bekannt als universelle Referenzen. – Xeo
@Xeo: Anfangs dachte ich über eine einzige * Funktion * nach, keine Vorlage, also suchte ich nach einer einzigen Lösung. Sie haben natürlich Recht, da wir bereits Vorlagen haben, können wir sie auch verwenden. –