#include <functional>
#include <iostream>
std:: function < int ( int , int ) > sum = [ ] ( int a, int b) { return a + b; } ;
// create a "before" hook
template < typename Functor, typename Hook>
Functor hook_before( const Functor & original, Hook hook)
{
// not legal, but illustrates what I want to achive
template < typename Args ...args >
return [ = ] ( Args ...args )
{
hook( ) ;
original( args...) ;
} ;
}
int main( )
{
std:: cout << sum( 3 , 4 ) << std:: endl ;
auto myhook = [ ] ( ) { std:: cout << "Calculating sum" << std:: endl ; } ;
auto hooked_sum = hook_before( sum, myhook) ;
hooked_sum( 3 , 4 ) ;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0ZDo6ZnVuY3Rpb248aW50KGludCwgaW50KT4gc3VtID0gW10oaW50IGEsIGludCBiKSB7IHJldHVybiBhICsgYjsgfTsKCi8vIGNyZWF0ZSBhICJiZWZvcmUiIGhvb2sKdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvciwgdHlwZW5hbWUgSG9vaz4KRnVuY3RvciBob29rX2JlZm9yZShjb25zdCBGdW5jdG9yICYgb3JpZ2luYWwsIEhvb2sgaG9vaykKewogICAgLy8gbm90IGxlZ2FsLCBidXQgaWxsdXN0cmF0ZXMgd2hhdCBJIHdhbnQgdG8gYWNoaXZlCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdzIC4uLmFyZ3M+IAogICAgcmV0dXJuIFs9XShBcmdzIC4uLmFyZ3MpCiAgICB7CiAgICAgICAgaG9vaygpOwogICAgICAgIG9yaWdpbmFsKGFyZ3MuLi4pOwogICAgfTsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgc3VtKDMsIDQpIDw8IHN0ZDo6ZW5kbDsKCiAgICBhdXRvIG15aG9vayA9IFtdKCkgeyBzdGQ6OmNvdXQgPDwgIkNhbGN1bGF0aW5nIHN1bSIgPDwgc3RkOjplbmRsOyB9OwogICAgYXV0byBob29rZWRfc3VtID0gaG9va19iZWZvcmUoc3VtLCBteWhvb2spOwogICAgaG9va2VkX3N1bSgzLCA0KTsKfQ==