Alle oben genannten Antworten sind kompliziert und verwenden Bibliotheken. Meine Antwort hier ist bei weitem die einfachste und benötigt keine Bibliothek Header.
// "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
nun in der Implementierungsdatei gehen Sie wie folgt
// "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;
}
Ende der Geschichte. Jetzt ist es, wie Sie es in Ihrem Code verwenden können.
// "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;
}
Das ist es Leute!
Vorteile:
die Klasse „deco“ hat nur ein Datenelement => kleine Speicher Fußdruck
der Betreiber() nimmt eine beliebige Anzahl von Argumenten, also können Sie jede Funktion dekorieren unabhängig von der Anzahl der Argumente.
Einfache Implementierung => einfaches Debugging und Testen.
Nachteile:
Hübscher Code, aber zu lang. Ich verstehe, das ist nicht Py, und C++ nicht starke Syntax Zucker wie Py zur Verfügung gestellt. :) Aber gibt es Weg, einige Makros zu erklären und Ihren Code zu verwenden, wie ich in meinen Beispielen zeige? Diese dekorierte Methode wird in Runtime definiert, aber ich möchte sie in allen anderen Funktionen und Klassen verwenden. Ich muss "makeDecorator" überall wiederholen? Danke. :) – Broly
@Broly, ja, du musst die Aufrufe von 'makeDecorator()' mindestens einmal für jede Funktion wiederholen, die du dekorieren willst. Um die vorgeschlagene Code-Produktionsqualität zu erreichen, benötigen Sie ein wenig Arbeit. –