たとえば、std::bindを使用できます。
std::bind2nd (std::ptr_fun (foo), arg2) (arg1) // replace second argument
std::bind1st (std::ptr_fun (foo), arg1) (arg2) // replace/bind first argument
変数に割り当てることもできます。
auto fun = std::bind1st (std::ptr_fun (foo), 2);
auto fun = std::bind2nd (std::ptr_fun (foo), 2);
または、コンパイラがC++11をサポートしていない場合
typedef std::binder1st<std::pointer_to_binary_function<int, int, int>> fun_type;
fun_type fun = std::bind1st (std::ptr_fun (foo), 2); // foo (2, arg2);
typedef std::binder2nd<std::pointer_to_binary_function<int, int, int>> fun_type2;
fun_type2 fun = std::bind2nd (std::ptr_fun (foo), 2); // foo (arg1, 2);
それからそれを呼びます
fun (arg);