#include <iostream>
#include <functional>

class Fred {
public:
  void f() { std::cout << "f" << std::endl; }
  void g() { std::cout << "g" << std::endl; }
  void h() { std::cout << "h" << std::endl; }
  void i() { std::cout << "i" << std::endl; }

};

typedef  void (Fred::*FredMemFn)();

FredMemFn a[] = { &Fred::f, &Fred::g, &Fred::h, &Fred::i };

void userCode(Fred& fred, int memFnNum)
{
  std::function<void()> fn = std::bind(a[memFnNum], &fred);
  
  fn();

}

int main() {
	
	Fred fred;
	
	userCode(fred, 1);
	userCode(fred, 3);
	userCode(fred, 0);
	userCode(fred, 2);
	
	return 0;
}