Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef hFUNCTIONPOINTER
- #define hFUNCTIONPOINTER
- template <typename RET, typename ARG1 = int, typename ARG2 = int, typename ARG3 = int, typename ARG4 = int, typename ARG5 = int>
- class FunctionPointer {
- public:
- FunctionPointer() { }
- virtual ~FunctionPointer() { }
- virtual RET operator()(ARG1, ARG2, ARG3, ARG4, ARG5) = 0;
- };
- template <typename RET>
- class FunctionPointer<RET, int, int, int, int, int> {
- public:
- FunctionPointer() { }
- virtual ~FunctionPointer() { }
- virtual RET operator()() = 0;
- };
- template <typename RET, typename ARG1>
- class FunctionPointer<RET, ARG1, int, int, int, int> {
- public:
- FunctionPointer() { }
- virtual ~FunctionPointer() { }
- virtual RET operator()(ARG1) = 0;
- };
- template <typename RET, typename ARG1, typename ARG2>
- class FunctionPointer<RET, ARG1, ARG2, int, int, int>{
- public:
- FunctionPointer() { }
- virtual ~FunctionPointer() { }
- virtual RET operator()(ARG1, ARG2) = 0;
- };
- template <typename RET, typename ARG1, typename ARG2, typename ARG3>
- class FunctionPointer<RET, ARG1, ARG2, ARG3, int, int> {
- public:
- FunctionPointer() { }
- virtual ~FunctionPointer() { }
- virtual RET operator()(ARG1, ARG2, ARG3) = 0;
- };
- template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- class FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int> {
- public:
- FunctionPointer() { }
- virtual ~FunctionPointer() { }
- virtual RET operator()(ARG1, ARG2, ARG3, ARG4) = 0;
- };
- // ^ FUNCITON POINTER BASE v CLASS FUNCTION POINTER
- template <typename RET, class TYPE, typename ARG1 = int, typename ARG2 = int, typename ARG3 = int, typename ARG4 = int, typename ARG5 = int>
- class ClassFunctionPointer : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5> {
- public:
- ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2, ARG3, ARG4, ARG5));
- virtual ~ClassFunctionPointer() { }
- RET operator()(ARG1, ARG2, ARG3, ARG4, ARG5);
- private:
- TYPE obj;
- RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4, ARG5);
- };
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
- ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, ARG5>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4, ARG5)){
- this->obj = obj;
- this->fp = fp;
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
- RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, ARG5>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d, ARG5 e){
- return (this->obj.*this->fp)(a, b, c, d, e);
- }
- template <typename RET, class TYPE>
- class ClassFunctionPointer<RET, TYPE, int, int, int, int, int> : public FunctionPointer<RET> {
- public:
- ClassFunctionPointer(TYPE &, RET (TYPE::*)());
- virtual ~ClassFunctionPointer() { }
- RET operator()();
- private:
- TYPE obj;
- RET (TYPE::*fp)();
- };
- template <typename RET, class TYPE>
- ClassFunctionPointer<RET, TYPE, int, int, int, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)()){
- this->obj = obj;
- this->fp = fp;
- }
- template <typename RET, class TYPE>
- RET ClassFunctionPointer<RET, TYPE, int, int, int, int, int>::operator()(){
- return (this->obj.*this->fp)();
- }
- template <typename RET, class TYPE, typename ARG1>
- class ClassFunctionPointer<RET, TYPE, ARG1, int, int, int, int> : public FunctionPointer<RET, ARG1> {
- public:
- ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1));
- virtual ~ClassFunctionPointer() { }
- RET operator()(ARG1);
- private:
- TYPE obj;
- RET (TYPE::*fp)(ARG1);
- };
- template <typename RET, class TYPE, typename ARG1>
- ClassFunctionPointer<RET, TYPE, ARG1, int, int, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1)){
- this->obj = obj;
- this->fp = fp;
- }
- template <typename RET, class TYPE, typename ARG1>
- RET ClassFunctionPointer<RET, TYPE, ARG1, int, int, int, int>::operator()(ARG1 a){
- return (this->obj.*this->fp)(a);
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2>
- class ClassFunctionPointer<RET, TYPE, ARG1, ARG2, int, int, int> : public FunctionPointer<RET, ARG1, ARG2> {
- public:
- ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2));
- virtual ~ClassFunctionPointer() { }
- RET operator()(ARG1, ARG2);
- private:
- TYPE obj;
- RET (TYPE::*fp)(ARG1, ARG2);
- };
- template <typename RET, class TYPE, typename ARG1, typename ARG2>
- ClassFunctionPointer<RET, TYPE, ARG1, ARG2, int, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2)){
- this->obj = obj;
- this->fp = fp;
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2>
- RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, int, int, int>::operator()(ARG1 a, ARG2 b){
- return (this->*this->fp)(a, b);
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3>
- class ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, int, int> : public FunctionPointer<RET, ARG1, ARG2, ARG3>{
- public:
- ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2, ARG3));
- virtual ~ClassFunctionPointer() { }
- RET operator()(ARG1, ARG2, ARG3);
- private:
- TYPE obj;
- RET (TYPE::*fp)(ARG1, ARG2, ARG3);
- };
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3>
- ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, int, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2, ARG3)){
- this->obj = obj;
- this->fp = fp;
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3>
- RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, int, int>::operator()(ARG1 a, ARG2 b, ARG3 c){
- return (this->obj.*this->fp)(a, b, c);
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- class ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4> : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4> {
- public:
- ClassFunctionPointer(TYPE &, RET (TYPE::*)(ARG1, ARG2, ARG3, ARG4));
- virtual ~ClassFunctionPointer() { }
- RET operator()(ARG1, ARG2, ARG3, ARG4);
- private:
- TYPE obj;
- RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4);
- };
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, int>::ClassFunctionPointer(TYPE &obj, RET (TYPE::*fp)(ARG1, ARG2, ARG3, ARG4)){
- this->obj = obj;
- this->fp = fp;
- }
- template <typename RET, class TYPE, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- RET ClassFunctionPointer<RET, TYPE, ARG1, ARG2, ARG3, ARG4, int>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d){
- return (this->obj.*this->fp)(a, b, c, d);
- }
- // ^ CLASS FUNCTION POINTER v GLOBAL FUNCTION POINTER
- template <typename RET, typename ARG1 = int, typename ARG2 = int, typename ARG3 = int, typename ARG4 = int, typename ARG5 = int>
- class GlobalFunctionPointer : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5> {
- public:
- GlobalFunctionPointer(RET (*)(ARG1, ARG2, ARG3, ARG4, ARG5));
- virtual ~GlobalFunctionPointer() { }
- RET operator()(ARG1, ARG2, ARG3, ARG4, ARG5);
- private:
- RET (*fp)(ARG1, ARG2, ARG3, ARG4, ARG5);
- };
- template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
- GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2, ARG3, ARG4, ARG5)) {
- this->fp = fp;
- }
- template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>
- RET GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, ARG5>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d, ARG5 e) {
- return (this->fp)(a, b, c, d, e);
- }
- template <typename RET>
- class GlobalFunctionPointer<RET, int, int, int, int, int> : public FunctionPointer<RET>{
- public:
- GlobalFunctionPointer(RET (*)());
- virtual ~GlobalFunctionPointer() { }
- RET operator()();
- private:
- RET (*fp)();
- };
- template <typename RET>
- GlobalFunctionPointer<RET, int, int, int, int, int>::GlobalFunctionPointer(RET (*fp)()) {
- this->fp = fp;
- }
- template <typename RET>
- RET GlobalFunctionPointer<RET, int, int, int, int, int>::operator()(){
- return (this->fp)();
- }
- template <typename RET, typename ARG1>
- class GlobalFunctionPointer<RET, ARG1, int, int, int, int> : public FunctionPointer<RET, ARG1> {
- public:
- GlobalFunctionPointer(RET (*)(ARG1));
- virtual ~GlobalFunctionPointer() { }
- RET operator()(ARG1);
- private:
- RET (*fp)(ARG1);
- };
- template <typename RET, typename ARG1>
- GlobalFunctionPointer<RET, ARG1, int, int, int, int>::GlobalFunctionPointer(RET (*fp)(ARG1)){
- this->fp = fp;
- }
- template <typename RET, typename ARG1>
- RET GlobalFunctionPointer<RET, ARG1, int, int, int, int>::operator()(ARG1 a){
- return (this->fp)(a);
- }
- template <typename RET, typename ARG1, typename ARG2>
- class GlobalFunctionPointer<RET, ARG1, ARG2, int, int, int> : public FunctionPointer<RET, ARG1, ARG2> {
- public:
- GlobalFunctionPointer(RET (*)(ARG1, ARG2));
- virtual ~GlobalFunctionPointer() { }
- RET operator()(ARG1, ARG2);
- private:
- RET (*fp)(ARG1, ARG2);
- };
- template <typename RET, typename ARG1, typename ARG2>
- GlobalFunctionPointer<RET, ARG1, ARG2, int, int, int>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2)) {
- this->fp = fp;
- }
- template <typename RET, typename ARG1, typename ARG2>
- RET GlobalFunctionPointer<RET, ARG1, ARG2, int, int, int>::operator()(ARG1 a, ARG2 b) {
- return (this->fp)(a, b);
- }
- template <typename RET, typename ARG1, typename ARG2, typename ARG3>
- class GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, int, int> : public FunctionPointer<RET, ARG1, ARG2, ARG3> {
- public:
- GlobalFunctionPointer(RET (*)(ARG1, ARG2, ARG3));
- virtual ~GlobalFunctionPointer() { }
- RET operator()(ARG1, ARG2, ARG3);
- private:
- RET (*fp)(ARG1, ARG2, ARG3);
- };
- template <typename RET, typename ARG1, typename ARG2, typename ARG3>
- GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, int, int>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2, ARG3)) {
- this->fp = fp;
- }
- template <typename RET, typename ARG1, typename ARG2, typename ARG3>
- RET GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, int, int>::operator()(ARG1 a, ARG2 b, ARG3 c) {
- return (this->fp)(a, b, c);
- }
- template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- class GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int> : public FunctionPointer<RET, ARG1, ARG2, ARG3, ARG4> {
- public:
- GlobalFunctionPointer(RET (*)(ARG1, ARG2, ARG3, ARG4));
- virtual ~GlobalFunctionPointer() { }
- RET operator()(ARG1, ARG2, ARG3, ARG4);
- private:
- RET (*fp)(ARG1, ARG2, ARG3, ARG4);
- };
- template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int>::GlobalFunctionPointer(RET (*fp)(ARG1, ARG2, ARG3, ARG4)) {
- this->fp = fp;
- }
- template <typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>
- RET GlobalFunctionPointer<RET, ARG1, ARG2, ARG3, ARG4, int>::operator()(ARG1 a, ARG2 b, ARG3 c, ARG4 d){
- return (this->fp)(a, b, c, d);
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement