Le temps de compilation vs moment de l'exécution du polymorphisme en C++ avantages/inconvénients

En C++ quand il est possible de mettre en œuvre la même fonctionnalité en utilisant soit le moment de l'exécution (sous-classes, fonctions virtuelles) ou au moment de la compilation (modèles, la fonction de surcharge) polymorphisme, pourquoi choisir l'un plutôt que l'autre?

Je pense que le code compilé serait plus grande pour le moment de la compilation de polymorphisme (plus de la méthode/de la classe des définitions de types de modèle), et que le temps de compilation serait de vous donner plus de flexibilité, tandis que les temps d'exécution serait vous donner la "sécurité" de polymorphisme (c'est à dire plus difficile à être utilisé, à tort, par accident).

Sont mes hypothèses correctes? Existe-il d'autres avantages/inconvénients? Quelqu'un peut-il donner un exemple précis où les deux seraient des options viables, mais l'un ou l'autre serait clairement un meilleur choix?

Aussi, n'moment de la compilation, le polymorphisme de produire plus vite, de code, car il n'est pas nécessaire d'appeler des fonctions par le biais de vtable, ou cela est-il optimisé par le compilateur de toute façon?

Exemple:

class Base
{
  virtual void print() = 0;
}

class Derived1 : Base
{
  virtual void print()
  {
     //do something different
  }
}

class Derived2 : Base
{
  virtual void print()
  {
    //do something different
  }
}

//Run time
void print(Base o)
{
  o.print();
}

//Compile time
template<typename T>
print(T o)
{
  o.print();
}
L'inconvénient majeur de la compilation polymorphisme est que, parfois, vous ne pouvez pas le faire. Comme quand vous gérer des objets à travers une interface. Tant que vous pouvez utiliser le temps de compilation, suppose que c'est mieux pour le plus de temps. Et vous pouvez faire votre routine d'accepter toutes les deux avec un peu d'effort.
Le "temps d'exécution" exemple ne compile pas - on peut passer d'une classe de base de pointeur et de réaliser la distribution dynamique, mais depuis la Base est résumé, vous ne peut pas créer un objet.
Double Possible de les modèles C++ pour les performances?

OriginalL'auteur mclaassen | 2013-06-01