YonKeenn </>
Journal About Portfolio Research Post

YonKeenn </>

Hello, I'm Jhon Vargas - a Data Scientist & Technical Lead

Curious. Self Learning. Proactive.

Pointers in C++

3 minutes
August 21, 2022
438 Words

This post focus in pointers c++ 17 and beyond…

template<typename CB>
class CountCalls
{
private:
CB callback; // callback to call
long calls = 0; // counter for calls

public:
CountCalls(CB cb) : callback(cb) {} 

template<typename... Args> // Metodo template dentro de una clase template.
decltype(auto) operator() (Args&&... args)
{ ++calls;
return callback(forward<Args>(args)...);
}
auto count() const { return calls; }
};

print es una funcion que recibe un vector de enteros por referencia y devuelve un float:

float print(const vector<int>& coll)
{
cout << "elems: ";
for (const auto& elem : coll)
{ cout << elem << ' '; }
cout << '\n';
return 0.0;
}

Idem. TestFn funcion de prueba.

void TestFn(int x, float f, string str)
{
cout << "x = " << x << " f = " << f << " str: " << str << endl;
}

Para probar CountCalls, se creoa DemoCallBack():

CountCalls cb(print); → genera un objeto del tipo CountCalls llamado cb que recibe como parametro la funcion(recordar: pasar una funcion significa pasar un puntero a la funcion, es decir su direccion) print que es guardado en la variable CB callback. CountCalls cc(TestFn);→ idem

cb(vals); → sobrecarga de operator() al objeto cb con el argumento vals que lo que hace al final es aumentar la variable long ++calls y retornar el puntero a la funcion print(vals) con vals desempaquetado. cc(3,6.6,“hi”); → idem

void DemoCallBacks()
{
vector<int> vals{0, 8, 15, 42, 13, -1, 0};
CountCalls cb(print);
cb(vals);
cb(vals);
cout << "CountCalls=" << cb.count() << endl;

CountCalls cc(TestFn);
cc(3,6.6,"hi");

}

Resultado:
>>>>>>>>>>>>> DemoCallBacks() ...
elems: 0 8 15 42 13 -1 0 
elems: 0 8 15 42 13 -1 0 
CountCalls=2
x = 3 f = 6.6 str: hi