#include <iostream>
#include <functional>
using namespace std;
typedef double R;
auto f( std::array<R, 3> &p ) -> R {
return p[ 0 ] + 2 * p[ 1 ] + 3 * p[ 2 ];
};
class Ftor
{
int idx;
R (*func)( std::array<R, 3> &p );
public:
Ftor( int _idx, R (*_func)( std::array<R, 3> &p ) ): idx( _idx ), func( _func ) {};
R operator()( R x )
{
std::array<R, 3> p = { 0, 0, 0 };
p[ idx ] = x;
return func( p );
}
};
auto main() -> int {
Ftor fx{ 0, f };
Ftor fy{ 1, f };
Ftor fz{ 2, f };
cout << fx( 5 ) << endl; // 5
cout << fy( 5 ) << endl; // 10
cout << fz( 5 ) << endl; // 15
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGRvdWJsZSBSOwoKYXV0byBmKCBzdGQ6OmFycmF5PFIsIDM+ICZwICkgLT4gUiB7CiAgICByZXR1cm4gcFsgMCBdICsgMiAqIHBbIDEgXSArIDMgKiBwWyAyIF07Cn07CgpjbGFzcyBGdG9yCnsKCWludCBpZHg7CglSICgqZnVuYykoIHN0ZDo6YXJyYXk8UiwgMz4gJnAgKTsKcHVibGljOgoJRnRvciggaW50IF9pZHgsIFIgKCpfZnVuYykoIHN0ZDo6YXJyYXk8UiwgMz4gJnAgKSApOiBpZHgoIF9pZHggKSwgZnVuYyggX2Z1bmMgKSB7fTsKCVIgb3BlcmF0b3IoKSggUiB4ICkKCXsKCQlzdGQ6OmFycmF5PFIsIDM+IHAgPSB7IDAsIDAsIDAgfTsJCgkJcFsgaWR4IF0gPSB4OwoJCXJldHVybiBmdW5jKCBwICk7Cgl9Cn07CgphdXRvIG1haW4oKSAtPiBpbnQgewoJRnRvciBmeHsgMCwgZiB9OwoJRnRvciBmeXsgMSwgZiB9OwoJRnRvciBmensgMiwgZiB9OwoKICAgIGNvdXQgPDwgZngoIDUgKSA8PCBlbmRsOyAvLyA1CiAgICBjb3V0IDw8IGZ5KCA1ICkgPDwgZW5kbDsgLy8gMTAKICAgIGNvdXQgPDwgZnooIDUgKSA8PCBlbmRsOyAvLyAxNQoKICAgIHJldHVybiAwOwp9Cg==