La fonction passée comme argument de modèle

Je suis à la recherche pour les règles impliquant passant modèles C++ des fonctions comme arguments.

C'est pris en charge par le C++, comme illustré par un exemple ici:

#include <iostream>

void add1(int &v)
{
  v+=1;
}

void add2(int &v)
{
  v+=2;
}

template <void (*T)(int &)>
void doOperation()
{
  int temp=0;
  T(temp);
  std::cout << "Result is " << temp << std::endl;
}

int main()
{
  doOperation<add1>();
  doOperation<add2>();
}

L'apprentissage de cette technique est difficile, cependant. Googler pour "fonctionner comme un argument de modèle" n'avance pas beaucoup. Et le classique Les Modèles C++ Le Guide Complet étonnamment aussi ne discutent pas (au moins pas de ma recherche).

Les questions que j'ai est de savoir si c'est valable en C++ (ou juste une partie largement pris en charge extension).

Aussi, est-il un moyen pour permettre à un foncteur avec la même signature pour être utilisé de façon interchangeable avec des fonctions explicites lors de ce type de modèle invocation?

Ce qui suit ne pas de travail dans le programme ci-dessus, au moins dans Visual C++, car la syntaxe est évidemment faux. Il serait agréable d'être en mesure de passer d'une fonction pour un foncteur, et vice-versa, semblable à la façon dont vous pouvez passer un pointeur de fonction ou de functor pour le std::algorithme de tri si vous souhaitez définir une comparaison personnalisée de l'opération.

   struct add3 {
      void operator() (int &v) {v+=3;}
   };
...

    doOperation<add3>();

Des pointeurs vers un lien web ou deux, ou une page dans les Modèles C++ livre serait appréciée!

InformationsquelleAutor SPWorley | 2009-07-23