template X & mu(X & x) { return x; } template class bind1 { private: F f_; A1 a1_; public: bind1(F const & f, A1 const & a1): f_(f), a1_(a1) {} decltype( (*(F*)0)(mu(*(A1*)0)) ) operator()() { return f_(mu(a1_)); } }; template bind1 bind(F f, A1 a1) { return bind1(f, a1); } struct square { template T operator()(T x) const { return x * x; } }; #include int main() { std::cout << bind(square(), 5)() << std::endl; }