#include <vector>
#include <iostream>
#include <string>
#include <memory>
#include <math.h>
#include <list>
#include <thread>
#include <atomic>
#include <functional>

using namespace std;


 class MClass
{
public:
  std::function<void(void)> func_ptr;

  void setFuncPtr(const std::function<void(void)>& ptr)
  {
    func_ptr = ptr;
  }

  void callFuncPtr()
  {
    func_ptr();
  }
};
 
 void globalFunction() { 
 std::cout << " do globalFunction " << std::endl;
 }

 struct Test
 {
   void print() { cout << "Test::print" << endl; }
 };


int main(int argc, int argv[])
{
   MClass m;
   m.setFuncPtr(globalFunction);
   m.callFuncPtr();

   m.setFuncPtr([](){ std::cout << " do something " << std::endl; });
   m.callFuncPtr();

   Test t;
   m.setFuncPtr(std::bind(&Test::print, t));
   m.callFuncPtr();
  return(0);
}