17.11
2020
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.