Merci à C++11, nous avons reçu l' std::function
famille de foncteur des wrappers. Malheureusement, je n'arrête pas d'entendre que de mauvaises choses à propos de ces nouveaux ajouts. Le plus populaire, c'est qu'ils sont horriblement lent. Je l'ai testé et ils ont vraiment sucer en comparaison avec les modèles.
#include <iostream>
#include <functional>
#include <string>
#include <chrono>
template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }
float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; }
int main() {
using namespace std::chrono;
const auto tp1 = system_clock::now();
for (int i = 0; i < 1e8; ++i) {
calc1([](float arg){ return arg * 0.5f; });
}
const auto tp2 = high_resolution_clock::now();
const auto d = duration_cast<milliseconds>(tp2 - tp1);
std::cout << d.count() << std::endl;
return 0;
}
111 ms vs 1241 mme. Je suppose que c'est parce que les modèles peuvent être bien incorporé, tout en function
s couvrir le fonctionnement interne via les appels virtuels.
Évidemment, les modèles ont leurs problèmes tels que je les vois:
- ils doivent être fournis comme en-têtes, ce qui n'est pas quelque chose que vous pourriez ne pas souhaiter le faire lors de la libération de votre bibliothèque comme un code source fermé,
- ils peuvent prendre le temps de compilation beaucoup plus longtemps, à moins
extern template
-comme la politique est introduit, - il n'existe pas (du moins à ma connaissance) propre manière de représenter les exigences (concepts, anyone?) d'un modèle, d'un bar un commentaire décrivant ce genre de foncteur est prévu.
Je peux donc supposer que function
s peut être utilisé comme de facto standard de transmission de foncteurs, et dans les endroits où la haute performance attendue des modèles devraient être utilisés?
Edit:
Mon compilateur est le compilateur de Visual Studio 2012 sans CTP.