#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;
}
