Sto cercando le regole che implicano il passaggio delle funzioni dei modelli C ++ come argomenti.
Questo è supportato da C ++ come mostrato da un esempio qui:
#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>();
}
Conoscere questa tecnica è tuttavia difficile. Cercare su Google "funzione come argomento modello" non porta a molto. E anche i classici modelli C ++ La Guida Completa sorprendentemente non ne discutono (almeno non dalla mia ricerca).
Le domande che ho sono se questo è C ++ valido (o solo qualche estensione ampiamente supportata).
Inoltre, esiste un modo per consentire a un funzione con la stessa firma di essere utilizzata in modo intercambiabile con funzioni esplicite durante questo tipo di invocazione del modello?
Quanto segue non funziona nel programma precedente, almeno in Visual C ++ , poiché la sintassi è ovviamente errata. Sarebbe bello poter cambiare una funzione per un functor e viceversa, in modo simile al modo in cui è possibile passare un puntatore a una funzione o un funzione per l'algoritmo std :: sort se si desidera definire un'operazione di confronto personalizzata.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
I puntatori a un collegamento web o due, o una pagina nel libro Modelli C ++ sarebbero apprezzati!
-std=gnu++17
. Posso usare il risultato di un operatore di conversione lambda constexpr C ++ 17 captureless come argomento non tipo del modello di puntatore a funzione? .