Estou procurando as regras que envolvem a passagem de modelos C ++ como argumentos.
Isso é suportado pelo C ++, como mostra um exemplo aqui:
#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>();
}
Aprender sobre essa técnica é difícil, no entanto. Pesquisar no Google "funcionar como argumento de modelo" não leva a muito. E, surpreendentemente, os clássicos modelos C ++ O Guia Completo também não o discute (pelo menos não na minha pesquisa).
As perguntas que tenho são se este é C ++ válido (ou apenas alguma extensão amplamente suportada).
Além disso, existe uma maneira de permitir que um functor com a mesma assinatura seja usado de forma intercambiável com funções explícitas durante esse tipo de chamada de modelo?
O seguinte não funciona no programa acima, pelo menos no Visual C ++ , porque a sintaxe está obviamente errada. Seria bom poder alternar uma função para um functor e vice-versa, semelhante à maneira como você pode passar um ponteiro de função ou functor para o algoritmo std :: sort, se desejar definir uma operação de comparação personalizada.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Ponteiros para um link da Web ou dois, ou uma página no livro Modelos C ++ seriam apreciados!
-std=gnu++17
. Posso usar o resultado de um operador de conversão constexpr lambda capturável do C ++ 17 como argumento não-tipo de modelo de ponteiro de função? .