Les lambdas "decay" en simple pointeur de fonction quand elles n'ont pas d'état. Je crois que la plupart du temps on souhaite que ces fonctions de nettoyage capturent tout par référence. Donc ça risque de pas être tip-top.
Voilà ma tentative d'implémentation, il faut au minimum C++14, et ça nécessite simplement d'avoir accès à std::move.
#include<utility>template<typenameTCallback>classDefer{private:TCallbackmCallback;public:Defer(TCallback&&callback):mCallback(std::move(callback)){}~Defer()noexcept{mCallback();}};structdetail_defer_tag{};template<typenameTCallback>autooperator+(constdetail_defer_tag&,TCallback&&callback){returnDefer<TCallback>(std::move(callback));}#define CONCAT_IMPL( x, y ) x##y#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )#define defer const auto MACRO_CONCAT(d_, __COUNTER__) = detail_defer_tag{} + [&]()staticvolatileboolhasResource=false;intmain(intargc,constchar**){intretVal=argc;hasResource=true;defer{hasResource=false;};if(hasResource){retVal--;}returnretVal;}
[^] # Re: Allocs
Posté par amdg . En réponse au journal Une 20-aine de lignes de code pour le defer de Go en C++. Évalué à 7.
Les lambdas "decay" en simple pointeur de fonction quand elles n'ont pas d'état. Je crois que la plupart du temps on souhaite que ces fonctions de nettoyage capturent tout par référence. Donc ça risque de pas être tip-top.
Voilà ma tentative d'implémentation, il faut au minimum C++14, et ça nécessite simplement d'avoir accès à
std::move.Avec le lien godbolt qui va bien pour montrer que ça optimise pas trop mal: https://godbolt.org/z/7bK7q8Phe