Tutte le risposte sopra sono complicate e utilizzano le librerie. La mia risposta qui è di gran lunga la più semplice e non ha bisogno di alcuna intestazione di libreria.
// "DECORATOR.h"
#pragma once
#ifndef DECORATOR_H
#define DECORATOR_H
template<typename T>
class deco
{
T* m_func;
public:
explicit deco(T func);
template<typename ...args>
auto operator()(args... Args);
}
#endif // DECORATOR_H
Ora nel file di implementazione effettuare le seguenti operazioni
// "DECORATOR.cpp"
template<typename T>
inline deco<T>::deco(T func)
:m_func(func)
{
};
// implementing the function call operator
template <typename T>
template <typename ...args>
auto deco<T>::operator()(args ...Args)
{
//Do some stuff defore the decorated function call
// ....
// Call the decorated function.
auto rv = m_func(Args...);
//Do some stuff after the function call
// ....
return rv;
}
Fine della storia. Ora questo è come usarlo nel tuo codice.
// "main.cpp"
#include "DECORATOR.h"
#include <stdio.h> // just for printf()
// functions to decorate
int add(int a, int b)
{
return a+b;
};
int sub(int a, int b)
{
return a-b;
};
// Main function
int main()
{
// decorate the functions "add", "sub"
deco<decltype(add)> add_Deco(add);
deco<decltype(sub)> sub_Deco(sub);
// call your decorated functions
printf("result of decorated Add =%d\n", add_Deco(5,2));
printf("result of decorated Sub =%d\n", sub_Deco(4,3));
return 0;
}
Questo è gente!
Pro:
alla classe "deco" ha un solo piede di stampa => piccola memoria un membro di dati
l'operatore() prende un numero qualsiasi di argomenti, in modo da poter decorare qualsiasi funzione indipendentemente dal numero di argomenti.
Implementazione semplice => debug e test semplici.
Contro:
Codice carino, ma troppo lungo. Capisco, questo non è Py, e C++ non ha fornito un forte zucchero sintassi come Py. :) Ma c'è modo di dichiarare alcuni macro e usare il tuo codice come mostro nei miei esempi? Questo metodo decorato è definito in runtime, ma voglio usarlo in tutte le altre funzioni e classi. Devo ripetere "makeDecorator" ovunque? Grazie. :) – Broly
@Broly, sì, dovrai ripetere le chiamate a 'makeDecorator()' almeno una volta per ogni funzione che desideri decorare. Per rendere la qualità di produzione del codice suggerita, avrai bisogno di un po 'di lavoro. –