Advertisement
Guest User

C++ - Function Pointers.

a guest
Nov 5th, 2012
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.84 KB | None | 0 0
  1. #ifndef hFUNCTIONPOINTER
  2. #define hFUNCTIONPOINTER
  3.  
  4. template <typename RET, typename ARG1 = int, typename ARG2 = int, typename ARG3 = int, typename ARG4 = int, typename ARG5 = int>
  5. class FunctionPointer {
  6.  
  7.     public:
  8.  
  9.         FunctionPointer() {  }
  10.         virtual ~FunctionPointer() {  }
  11.  
  12.         virtual RET operator()(ARG1, ARG2, ARG3, ARG4, ARG5) = 0;
  13.  
  14. };
  15.  
  16.  
  17.  
  18. template <typename RET>
  19. class FunctionPointer<RET, int, int, int, int, int> {
  20.  
  21.     public:
  22.  
  23.         FunctionPointer() {  }
  24.         virtual ~FunctionPointer() {  }
  25.  
  26.         virtual RET operator()() = 0;
  27.  
  28. };
  29.  
  30.  
  31.  
  32. template <typename RET, typename ARG1>
  33. class FunctionPointer<RET, ARG1, int, int, int, int> {
  34.  
  35.     public:
  36.  
  37.         FunctionPointer() {  }
  38.         virtual ~FunctionPointer() {  }
  39.  
  40.         virtual RET operator()(ARG1) = 0;
  41.  
  42. };
  43.  
  44.  
  45.  
  46. template <typename RET, typename ARG1, typename ARG2>
  47. class FunctionPointer<RET, ARG1, ARG2, int, int, int>{
  48.  
  49.     public:
  50.  
  51.         FunctionPointer() {  }
  52.         virtual ~FunctionPointer() {  }
  53.  
  54.         virtual RET operator()(ARG1, ARG2) = 0;
  55.  
  56. };
  57.  
  58.  
  59.  
  60. template <typename RET, typename ARG1, typename ARG2, typename ARG3>
  61. class FunctionPointer<RET, ARG1, ARG2, ARG3, int, int> {
  62.  
  63.     public:
  64.  
  65.         FunctionPointer() {  }
  66.         virtual ~FunctionPointer() {  }
  67.  
  68.         virtual RET operator()(ARG1, ARG2, ARG3) = 0;
  69.  
  70. };
  71.  
  72.  
  73.  
  74. template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  75. class FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int> {
  76.  
  77.     public:
  78.  
  79.         FunctionPointer() {  }
  80.         virtual ~FunctionPointer() {  }
  81.  
  82.         virtual RET operator()(ARG1, ARG2, ARG3, ARG4) = 0;
  83.  
  84. };
  85.  
  86. // ^ FUNCITON POINTER BASE v CLASS FUNCTION POINTER
  87.  
  88. template <typename RET, class TYPE, typename ARG1 = int, typename ARG2 = int, typename ARG3 = int, typename ARG4 = int, typename ARG5 = int>
  89. class ClassFunctionPointer : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5> {
  90.  
  91.     public:
  92.  
  93.         ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2, ARG3, ARG4, ARG5));
  94.         virtual ~ClassFunctionPointer() {  }
  95.  
  96.         RET operator()(ARG1, ARG2, ARG3, ARG4, ARG5);
  97.  
  98.     private:
  99.  
  100.         TYPE obj;
  101.         RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4, ARG5);
  102.  
  103. };
  104.  
  105. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
  106. ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, ARG5>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4, ARG5)){
  107.  
  108.     this->obj = obj;
  109.     this->fp = fp;
  110.  
  111. }
  112.  
  113. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
  114. RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, ARG5>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d, ARG5 e){
  115.  
  116.     return (this->obj.*this->fp)(a, b, c, d, e);
  117.  
  118. }
  119.  
  120.  
  121.  
  122. template <typename RET, class TYPE>
  123. class ClassFunctionPointer<RET, TYPE, int, int, int, int, int> : public FunctionPointer<RET> {
  124.  
  125.     public:
  126.  
  127.         ClassFunctionPointer(TYPE &, RET (TYPE::*)());
  128.         virtual ~ClassFunctionPointer() {  }
  129.  
  130.         RET operator()();
  131.  
  132.     private:
  133.  
  134.         TYPE obj;
  135.         RET (TYPE::*fp)();
  136.  
  137. };
  138.  
  139. template <typename RET, class TYPE>
  140. ClassFunctionPointer<RET, TYPE, int, int, int, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)()){
  141.  
  142.     this->obj = obj;
  143.     this->fp = fp;
  144.  
  145. }
  146.  
  147. template <typename RET, class TYPE>
  148. RET ClassFunctionPointer<RET, TYPE, int, int, int, int, int>::operator()(){
  149.  
  150.     return (this->obj.*this->fp)();
  151.  
  152. }
  153.  
  154.  
  155.  
  156. template <typename RET, class TYPE, typename ARG1>
  157. class ClassFunctionPointer<RET, TYPE, ARG1, int, int, int, int> : public FunctionPointer<RET, ARG1> {
  158.  
  159.     public:
  160.  
  161.         ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1));
  162.         virtual ~ClassFunctionPointer() {  }
  163.  
  164.         RET operator()(ARG1);
  165.  
  166.     private:
  167.  
  168.         TYPE obj;
  169.         RET (TYPE::*fp)(ARG1);
  170.  
  171. };
  172.  
  173. template <typename RET, class TYPE, typename ARG1>
  174. ClassFunctionPointer<RET, TYPE, ARG1, int, int, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1)){
  175.  
  176.     this->obj = obj;
  177.     this->fp = fp;
  178.  
  179. }
  180.  
  181. template <typename RET, class TYPE, typename ARG1>
  182. RET ClassFunctionPointer<RET, TYPE, ARG1, int, int, int, int>::operator()(ARG1 a){
  183.  
  184.     return (this->obj.*this->fp)(a);
  185.  
  186. }
  187.  
  188.  
  189.  
  190. template <typename RET, class TYPE, typename ARG1, typename ARG2>
  191. class ClassFunctionPointer<RET, TYPE, ARG1, ARG2, int, int, int> : public FunctionPointer<RET, ARG1, ARG2> {
  192.  
  193.     public:
  194.  
  195.         ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2));
  196.         virtual ~ClassFunctionPointer() {  }
  197.  
  198.         RET operator()(ARG1, ARG2);
  199.  
  200.     private:
  201.  
  202.         TYPE obj;
  203.         RET (TYPE::*fp)(ARG1, ARG2);
  204.  
  205. };
  206.  
  207. template <typename RET, class TYPE, typename ARG1, typename ARG2>
  208. ClassFunctionPointer<RET, TYPE, ARG1, ARG2, int, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2)){
  209.  
  210.     this->obj = obj;
  211.     this->fp = fp;
  212.  
  213. }
  214.  
  215. template <typename RET, class TYPE, typename ARG1, typename ARG2>
  216. RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, int, int, int>::operator()(ARG1 a, ARG2 b){
  217.  
  218.     return (this->*this->fp)(a, b);
  219.  
  220. }
  221.  
  222.  
  223.  
  224. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3>
  225. class ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, int, int> : public FunctionPointer<RET, ARG1, ARG2, ARG3>{
  226.  
  227.     public:
  228.  
  229.         ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2, ARG3));
  230.         virtual ~ClassFunctionPointer() {  }
  231.  
  232.         RET operator()(ARG1, ARG2, ARG3);
  233.  
  234.     private:
  235.  
  236.         TYPE obj;
  237.         RET (TYPE::*fp)(ARG1, ARG2, ARG3);
  238.  
  239. };
  240.  
  241. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3>
  242. ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2, ARG3)){
  243.  
  244.     this->obj = obj;
  245.     this->fp = fp;
  246.  
  247. }
  248.  
  249. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3>
  250. RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, int, int>::operator()(ARG1 a, ARG2 b, ARG3 c){
  251.  
  252.     return (this->obj.*this->fp)(a, b, c);
  253.  
  254. }
  255.  
  256.  
  257.  
  258. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  259. class ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4> : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4> {
  260.  
  261.     public:
  262.  
  263.         ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2, ARG3, ARG4));
  264.         virtual ~ClassFunctionPointer() {  }
  265.  
  266.         RET operator()(ARG1, ARG2, ARG3, ARG4);
  267.  
  268.     private:
  269.  
  270.         TYPE obj;
  271.         RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4);
  272.  
  273. };
  274.  
  275. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  276. ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4)){
  277.  
  278.     this->obj = obj;
  279.     this->fp = fp;
  280.  
  281. }
  282.  
  283. template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  284. RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, int>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d){
  285.  
  286.     return (this->obj.*this->fp)(a, b, c, d);
  287.  
  288. }
  289.  
  290. // ^ CLASS FUNCTION POINTER v GLOBAL FUNCTION POINTER
  291.  
  292. template <typename RET, typename ARG1 = int, typename ARG2 = int, typename ARG3 = int, typename ARG4 = int, typename ARG5 = int>
  293. class GlobalFunctionPointer : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5> {
  294.  
  295.     public:
  296.  
  297.         GlobalFunctionPointer(RET (*)(ARG1, ARG2, ARG3, ARG4, ARG5));
  298.         virtual ~GlobalFunctionPointer() {  }
  299.  
  300.         RET operator()(ARG1, ARG2, ARG3, ARG4, ARG5);
  301.  
  302.     private:
  303.  
  304.         RET (*fp)(ARG1, ARG2, ARG3, ARG4, ARG5);
  305.  
  306. };
  307.  
  308. template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
  309. GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2, ARG3, ARG4, ARG5)) {
  310.  
  311.     this->fp = fp;
  312.  
  313. }
  314.  
  315. template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
  316. RET GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d, ARG5 e) {
  317.  
  318.     return (this->fp)(a, b, c, d, e);
  319.  
  320. }
  321.  
  322.  
  323.  
  324. template <typename RET>
  325. class GlobalFunctionPointer<RET, int, int, int, int, int> : public FunctionPointer<RET>{
  326.  
  327.     public:
  328.  
  329.         GlobalFunctionPointer(RET (*)());
  330.         virtual ~GlobalFunctionPointer() {  }
  331.  
  332.         RET operator()();
  333.  
  334.     private:
  335.  
  336.         RET (*fp)();
  337.  
  338. };
  339.  
  340. template <typename RET>
  341. GlobalFunctionPointer<RET, int, int, int, int, int>::GlobalFunctionPointer(RET (*fp)()) {
  342.  
  343.     this->fp = fp;
  344.  
  345. }
  346.  
  347. template <typename RET>
  348. RET GlobalFunctionPointer<RET, int, int, int, int, int>::operator()(){
  349.  
  350.     return (this->fp)();
  351.  
  352. }
  353.  
  354.  
  355.  
  356. template <typename RET, typename ARG1>
  357. class GlobalFunctionPointer<RET, ARG1, int, int, int, int> : public FunctionPointer<RET, ARG1> {
  358.  
  359.     public:
  360.  
  361.         GlobalFunctionPointer(RET (*)(ARG1));
  362.         virtual ~GlobalFunctionPointer() {  }
  363.  
  364.         RET operator()(ARG1);
  365.  
  366.     private:
  367.  
  368.         RET (*fp)(ARG1);
  369.  
  370. };
  371.  
  372. template <typename RET, typename ARG1>
  373. GlobalFunctionPointer<RET, ARG1, int, int, int, int>::GlobalFunctionPointer(RET (*fp)(ARG1)){
  374.  
  375.     this->fp = fp;
  376.  
  377. }
  378.  
  379. template <typename RET, typename ARG1>
  380. RET GlobalFunctionPointer<RET, ARG1, int, int, int, int>::operator()(ARG1 a){
  381.  
  382.     return (this->fp)(a);
  383.  
  384. }
  385.  
  386.  
  387.  
  388. template <typename RET, typename ARG1, typename ARG2>
  389. class GlobalFunctionPointer<RET, ARG1, ARG2, int, int, int> : public FunctionPointer<RET, ARG1, ARG2> {
  390.  
  391.     public:
  392.  
  393.         GlobalFunctionPointer(RET (*)(ARG1, ARG2));
  394.         virtual ~GlobalFunctionPointer() {  }
  395.  
  396.         RET operator()(ARG1, ARG2);
  397.  
  398.     private:
  399.  
  400.         RET (*fp)(ARG1, ARG2);
  401.  
  402. };
  403.  
  404. template <typename RET, typename ARG1, typename ARG2>
  405. GlobalFunctionPointer<RET, ARG1, ARG2, int, int, int>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2)) {
  406.  
  407.     this->fp = fp;
  408.  
  409. }
  410.  
  411. template <typename RET, typename ARG1, typename ARG2>
  412. RET GlobalFunctionPointer<RET, ARG1, ARG2, int, int, int>::operator()(ARG1 a, ARG2 b) {
  413.  
  414.     return (this->fp)(a, b);
  415.  
  416. }
  417.  
  418.  
  419.  
  420. template <typename RET, typename ARG1, typename ARG2, typename ARG3>
  421. class GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, int, int> : public FunctionPointer<RET, ARG1, ARG2, ARG3> {
  422.  
  423.     public:
  424.  
  425.         GlobalFunctionPointer(RET (*)(ARG1, ARG2, ARG3));
  426.         virtual ~GlobalFunctionPointer() {  }
  427.  
  428.         RET operator()(ARG1, ARG2, ARG3);
  429.  
  430.     private:
  431.  
  432.         RET (*fp)(ARG1, ARG2, ARG3);
  433.  
  434. };
  435.  
  436. template <typename RET, typename ARG1, typename ARG2, typename ARG3>
  437. GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, int, int>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2, ARG3)) {
  438.  
  439.     this->fp = fp;
  440.  
  441. }
  442.  
  443. template <typename RET, typename ARG1, typename ARG2, typename ARG3>
  444. RET GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, int, int>::operator()(ARG1 a, ARG2 b, ARG3 c) {
  445.  
  446.     return (this->fp)(a, b, c);
  447.  
  448. }
  449.  
  450.  
  451.  
  452. template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  453. class GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int> : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4> {
  454.  
  455.     public:
  456.  
  457.         GlobalFunctionPointer(RET (*)(ARG1, ARG2, ARG3, ARG4));
  458.         virtual ~GlobalFunctionPointer() {  }
  459.  
  460.         RET operator()(ARG1, ARG2, ARG3, ARG4);
  461.  
  462.     private:
  463.  
  464.         RET (*fp)(ARG1, ARG2, ARG3, ARG4);
  465.  
  466. };
  467.  
  468. template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  469. GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2, ARG3, ARG4)) {
  470.  
  471.     this->fp = fp;
  472.  
  473. }
  474.  
  475. template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
  476. RET GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d){
  477.  
  478.     return (this->fp)(a, b, c, d);
  479.  
  480. }
  481.  
  482. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement