Halaman

Jumat, 02 November 2012

[c++] Function Pointers Snippet

Hi there, let the code speaks for it self.. ;)


// funtors.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

typedef float (*MyFuncPtrType)(int, char *);
MyFuncPtrType my_func_ptr;

float test_func(int a, char *c)
{
 fprintf(stderr, "in a function with argument: %d, %s\n", a, c);
 fflush(stderr);

 return a + 10.123f;
}

class functors;

typedef float (functors::*ClassMemFuncPtr)(int, char *);
// For const member functions, it's declared like this:
typedef float (functors::*ClassConstMemFuncPtr)(int, char *) const;

class functors
{
public:
 virtual ~functors()
 {
  obj = 0;
 }

 void invoke()
 {
  (obj->*memx)(10, "Yeah!!");
 }

 void bind_x(MyFuncPtrType funcPtr)
 {
  x = funcPtr;
 }

 float invoke_x(int a, char* c)
 {
  return x(a, c);
 }

 void bind_memx(functors *obj, ClassMemFuncPtr mem_func)
 {
  this->obj = obj;
  memx = mem_func;
 }

 float invoke_memx()
 {
  return (obj->*memx)(11, "Uh yeahh.. i'm invoked!!");
 }


private:
 MyFuncPtrType x;
 ClassMemFuncPtr memx;

 functors *obj;
};

class derived: public functors
{
public:
 float derived_func(int a, char *c)
 {
  fprintf(stderr, "I got called with the following params: %d, %s", a, c);
  return 1.01111f;
 }
};

int _tmain(int argc, _TCHAR* argv[])
{
 my_func_ptr = test_func;

 float a = my_func_ptr(10, "yohan");
 fprintf(stderr, "%f\n", a);
 fflush(stderr);

 functors *base = new functors();

 base->bind_x(test_func);

 a = base->invoke_x(11, "pandewi");
 fprintf(stderr, "%f\n", a);
 fflush(stderr);

 //testing member function..
 derived *the_derived = new derived();

 base->bind_memx(the_derived, static_cast(&derived::derived_func));

 base->invoke_memx();

 delete the_derived;

 base->invoke_memx();

 delete base;

 return 0;
}

Tidak ada komentar:

Posting Komentar