Por que você usaria um template de função no lugar de uma macro?

Passo 1

Uma macro pode ser definida para processar uma operação semelhante a uma função. Sempre que usarmos a macro e compilarmos o programa, o pré-processador simplesmente fará uma substituição para substituir o nome da macro pela operação real. Por exemplo, quando definimos uma macro como

#define COMPUTE(n1, n2) (n1 + n2)

e use isso no programa principal como

cout

O pré-processador substituirá a macro pela operação real (2 + 3). A principal vantagem de usar uma macro é que ela nos permite reutilizar a operação. A macro também pode funcionar com diferentes tipos de dados. Considere o exemplo dado acima, que pode funcionar com tipos numéricos como int e float. No entanto, devemos considerar também que o pré-processador realiza apenas a substituição. Isso implica que não haverá verificação de tipo para a macro. Nesse caso, isso pode produzir um erro durante o tempo de compilação quando um tipo de dados inadequado é passado no parâmetro de macro acima. Além disso, uma macro só pode ser definida como um código de linha única que pode não ser apropriado se quisermos criar operações complexas.

Passo 2

Por outro lado, com um template de função, funções sobrecarregadas são geradas pelo compilador para trabalhar com diferentes tipos de dados. Isso indica que o compilador gera definições reais das funções com uma verificação de tipo para garantir que a função correta seja chamada quando o modelo de função for invocado.

Passo 3

Assim, se quisermos que uma operação geralmente suporte qualquer tipo de dados e execute operações complexas, talvez seja melhor usar um modelo de função em vez de usar uma macro.

Resposta

Ver a explicação meu parça.