#include <iostream>
#include <functional>
#include <list>
using namespace std;
template < typename R, typename ... Arg >
function< R ( Arg...) > decor(
initializer_list<
function< function< R ( Arg...) > ( function< R ( Arg...) > ) >
> transformers,
function< R ( Arg...) > && func)
{
list< function< function< R ( Arg...) > ( function< R ( Arg...) > ) >> tfs;
tfs.assign ( transformers) ;
tfs.reverse ( ) ;
function< R ( Arg...) > fn = func;
for ( auto tf : tfs) {
fn = tf( fn) ;
}
return fn;
}
template < typename F>
F add42( F fn) {
return [ = ] ( int x) - > int {
return fn( x) + 42 ;
} ;
}
template < typename F>
F div2( F fn) {
return [ = ] ( int x) - > int {
return fn( x) / 2 ;
} ;
}
auto func = decor( { add42, div2} , [ = ] ( int x) - > int {
return x * 2 ;
} ) ;
int main( ) {
cout << "f(1) = " << func( 1 ) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGxpc3Q+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZz4KICAgIGZ1bmN0aW9uPFIgKEFyZy4uLik+IGRlY29yKAogICAgICAgIGluaXRpYWxpemVyX2xpc3Q8CiAgICAgICAgICAgIGZ1bmN0aW9uPGZ1bmN0aW9uPFIgKEFyZy4uLik+IChmdW5jdGlvbjxSIChBcmcuLi4pPik+CiAgICAgICAgPiB0cmFuc2Zvcm1lcnMsCiAgICAgICAgZnVuY3Rpb248UiAoQXJnLi4uKT4mJiBmdW5jKSAKICAgIHsKICAgICAgICBsaXN0PGZ1bmN0aW9uPGZ1bmN0aW9uPFIgKEFyZy4uLik+IChmdW5jdGlvbjxSIChBcmcuLi4pPik+PiB0ZnM7CiAgICAgICAgdGZzLmFzc2lnbih0cmFuc2Zvcm1lcnMpOwogICAgICAgIHRmcy5yZXZlcnNlKCk7CiAgICAgICAgCiAgICAgICAgZnVuY3Rpb248UiAoQXJnLi4uKT4gZm4gPSBmdW5jOwogICAgICAgIGZvciAoYXV0byB0ZiA6IHRmcykgewogICAgICAgICAgICBmbiA9IHRmKGZuKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZuOwogICAgfQogICAgCnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpGIGFkZDQyKEYgZm4pIHsKICAgIHJldHVybiBbPV0gKGludCB4KSAtPiBpbnQgewogICAgICAgIHJldHVybiBmbih4KSArIDQyOwogICAgfTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CkYgZGl2MihGIGZuKSB7CiAgICByZXR1cm4gWz1dIChpbnQgeCkgLT4gaW50IHsKICAgICAgICByZXR1cm4gZm4oeCkgLyAyOyAgCiAgICB9Owp9CiAKYXV0byBmdW5jID0gZGVjb3Ioe2FkZDQyLCBkaXYyfSwgWz1dIChpbnQgeCkgLT4gaW50IHsKICAgIHJldHVybiB4ICogMjsKfSk7CgppbnQgbWFpbigpIHsKICAgIGNvdXQgPDwgImYoMSkgPSAiIDw8IGZ1bmMoMSkgPDwgZW5kbDsKfQ==
compilation info
prog.cpp:41:2: error: no matching function for call to ‘decor(<brace-enclosed initializer list>, <lambda(int)>)’
prog.cpp:41:2: note: candidate is:
prog.cpp:8:26: note: template<class R, class ... Arg> std::function<_Res(_ArgTypes ...)> decor(std::initializer_list<std::function<std::function<_Res(_ArgTypes ...)>(std::function<_Res(_ArgTypes ...)>)> >, std::function<_Res(_ArgTypes ...)>&&)
prog.cpp:8:26: note: template argument deduction/substitution failed:
prog.cpp:41:2: note: ‘<lambda(int)>’ is not derived from ‘std::function<_Res(_ArgTypes ...)>’
prog.cpp:41:2: error: unable to deduce ‘auto’ from ‘<expression error>’
stdout