Szukam reguł dotyczących przekazywania funkcji szablonów C ++ jako argumentów.
Jest to obsługiwane przez C ++, jak pokazano na przykładzie tutaj:
#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>();
}
Jednak nauka tej techniki jest trudna. Googling dla „funkcja jako argument szablonu” nie prowadzi do wielu. I klasyczne szablony C ++ Kompletny przewodnik zaskakująco również go nie omawia (przynajmniej nie z mojego wyszukiwania).
Mam pytania, czy to jest poprawne C ++ (czy tylko jakieś szeroko obsługiwane rozszerzenie).
Czy jest też sposób, aby zezwolić na stosowanie funktora o tej samej sygnaturze zamiennie z funkcjami jawnymi podczas tego rodzaju wywoływania szablonu?
Poniższe nie działa w powyższym programie, przynajmniej w Visual C ++ , ponieważ składnia jest oczywiście nieprawidłowa. Byłoby miło móc wyłączyć funkcję funktora i vice versa, podobnie jak można przekazać wskaźnik funkcji lub funktor do algorytmu std :: sort, jeśli chcesz zdefiniować niestandardową operację porównania.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Będziemy wdzięczni za wskazania na link lub dwa lub stronę w książce szablonów C ++!
-std=gnu++17
. Czy mogę użyć wyniku bez przechwyconego operatora konwersji C ++ 17 lambda constexpr jako argumentu innego niż typ szablonu wskaźnika? .