Listing 6

#include <functional>
#include <iostream>
#include <math.h>
using std::cout;
using std::tr1::bind;
using namespace std::tr1::placeholders;

template <class Fun>
void call_zero(Fun fun)
  { // call function object with no arguments
  cout << ' ' << fun() << '\n';
  }
template <class Fun>
void call_one(Fun fun)
  { // call function argument with one argument
  double arg = 1.0;
  cout << ' ' << fun(arg) << '\n';
  }
template <class Fun>
void call_two(Fun fun)
  { // call function argument with two arguments
  double arg1 = 1.0;
  double arg2 = 2.0;
  cout << ' ' << fun(arg1, arg2) << '\n';
  }
int main()
  { // demonstrate use of bind
  cout << "calling cosf:\n";
  call_zero(bind(cosf, 1.0));  // object calls cosf(1.0)
  call_one(bind(cosf, _1));    // object calls cosf with first argument
  call_two(bind(cosf, _2));    // object calls cosf with second argument
  return 0;
  }