Macro ou Função com Template?

por Fabio A. Mazzarino

Desde o C é comum utilizar macros para funções genéricas que podem executar a mesma operação em diversos tipos. Macros como MAX, MIN, AVG (média), dentre outros. Com C++11 é possível implementar juntamente com templates e inferência de tipo com typeinfo funcionalidades bem mais complexas.

Para demonstrar o conceito vamos fazer um exemplo com uma macro que adiciona duas variáveis, e uma função que adiciona duas variáveis:


#include <iostream>
#include <typeinfo>

#define madd(a, b) (a + b)

template <typename T>
auto fadd(T a, T b) -> decltype(a + b) {
    return a + b;
}

int main() {
    int i1 = 5;
    int i2 = 8;
    std::cout << "madd(i1, i2): " << madd(i1, i2) << std::endl;
    std::cout << "fadd(i1, i2): " << fadd<decltype(i1)>(i1, i2) << std::endl;

    double d1 = 0.5;
    double d2 = 0.8;
    std::cout << "madd(d1, d2): " << madd(d1, d2) << std::endl;
    std::cout << "fadd(d1, d2): " << fadd<decltype(d1)>(d1, d2) << std::endl;

    std::string s1 = "s1";
    std::string s2 = "s2";
    std::cout << "madd(s1, s2): " << madd(s1, s2) << std::endl;
    std::cout << "fadd(s1, s2): " << fadd<decltype(s1)>(s1, s2) << std::endl;
}

A saída:

madd(i1, i2): 13
fadd(i1, i2): 13
madd(d1, d2): 1.3
fadd(d1, d2): 1.3
madd(s1, s2): s1s2
fadd(s1, s2): s1s2

Comprovando que a macro e a função são equivalentes.

Claro que o exemplo é apenas um conceito, para a adição é mais eficiente e o código é fica mais limpo utilizando macro. Mas para funcionalidades complexas fica muito mais claro utilizar uma função com template, e em alguns casos nem será possível implementar através de macro.