2014-12-28 3 views
1

Предполагая, что у меня есть класс myClass определяется следующим образом:функция член указатель шаблона класса

template<typename Type> class myClass { 

    public: 

     Type* pParent; 
     void (Type::*func_exe)(); 

     void execute(); 

}; 

И я хочу, чтобы использовать его в качестве параметра для функции fGiveMeYourClass, которая использует его для вызова это член-функция execute

void fGiveMeYourClass (?myClass?){ 

    ..?.. ->execute(); 

} 

, так как я не забочусь о том, что Type на самом деле в этом шаблоне и хотят только член-функция-указатель от этого класса, я бы хорошо с чем-то вроде ЬурейеГо, чтобы признать, что член-функцию-указатель как p arameter из fGiveMeYourClass

Я попробовал уже, но мои attepts казалось неудачу:

template <typename Type> typedef void(myClass<Type>::*pMyClassExec)(); 
void fGiveMeYourClass(pMyClassExec pointerToMemberFunction); 

Есть ли другой способ это может быть достигнуто или я делаю что-то не так?

+4

Почему не просто 'шаблон недействительным fGiveMeYourClass (MyClass сопзЬ & х) {х .Execute(); } '? Неясно, куда должен войти указатель функции. –

+0

Ну, я знаю, что могу просто создать шаблон всей функции, но поскольку этот класс используется как параметр множества других функций, что означало бы превращение их всех в шаблоны, я выгляжу как самое чистое решение для меня. Я думал, что может быть более простой способ ... особенно потому, что я забочусь только об одной функции-члене этого класса, которая работает одинаково независимо от того, что такое «Тип». –

+1

Вы можете объявить 'execute' как виртуальную функцию в нетемплифицированном базовом классе и передать указатель/ссылку на базу. –

ответ

0

Благодаря Alan Stokes на этот комментарий он разместил на мой вопрос:

Вы могли бы объявить выполнить в качестве виртуальной функции в не-шаблонного базового класса, и передать вокруг указателя/ссылки на базу

Это решить мою проблему.

В случае, если кому-то это интересно: Мне нужно было это, чтобы реализовать класс, который может быть передан на часть моего игрового движка, чтобы позволить автономно выполнять пользовательский кусок кода (тестовая функция?) на данном мероприятии, например когда пользователь нажимает кнопку «Debug-test-function» в игре. Это, однако, есть много других приложений, а также

Вот код, я использую до сих пор для этих упакованных команд:

class VE_COMMAND_PABA; 
class VE_STANDARD_COMMAND; 
template <typename ReturnValueType, typename Param1Type, typename Param2Type> class VE_FUNC_COMMAND; 
template <typename ParentClassType, typename ReturnValueType, typename Param1Type, typename Param2Type> class VE_DERIVED_FUNC_COMMAND; 

class VE_COMMAND_PABA { 

    public: 

     enum VE_COMMAND_TYPE { 

      VE_CT_STANDARD, 
      VE_CT_FUNC, 
      VE_CT_DERIVED 

     } paba_type; 

     virtual void execute() = 0; 
     virtual void Release() = 0; 

}; 

class VE_STANDARD_COMMAND : public VE_COMMAND_PABA { 

    private: 


    public: 

     enum VE_STANDARD_COMMAND_TYPE { 

      VE_SCT_BOOL_TOGGLE, 
      VE_SCT_INCREMENT, 
      VE_SCT_DECREMENT, 
      VE_SCT_SET_INT, 
      VE_SCT_SET_FLOAT, 
      VE_SCT_SET_BOOL 

     } type; 

     bool* pBOOL; 
     int* pINT; 
     float* pFLOAT; 

     bool params_allocated; 

     int* set_int; 
     float* set_float; 
     bool* set_bool; 

     VE_COMMAND_PABA* command_exe; // <- REFERENCE TO BASE CLASS 

     void execute(); 

     void Release(){ 

      if(this->command_exe != nullptr) this->command_exe->Release(); 

      if(this->type == VE_SCT_SET_BOOL && this->params_allocated) delete this->set_bool; 
      if(this->type == VE_SCT_SET_FLOAT && this->params_allocated) delete this->set_float; 
      if(this->type == VE_SCT_SET_INT && this->params_allocated) delete this->set_int; 

      delete this; // bye bye ... 

     }; 

}; 

template <typename ReturnValueType, typename Param1Type, typename Param2Type> class VE_FUNC_COMMAND : public VE_COMMAND_PABA { 

    public: 

     enum VE_FUNC_COMMAND_TYPE { 

      VE_FCT_FUNC, 
      VE_FCT_FUNC_PARAM, 
      VE_FCT_FUNC_TWO_PARAM, 

     } type; 

     Param1Type* pParam1; 
     Param2Type* pParam2; 

     Param1Type** lpParam1; 
     Param2Type** lpParam2; 

     bool params_allocated; 

     ReturnValueType (*func_exe)(); 
     ReturnValueType (*func_param_exe) (Param1Type parameter); 
     ReturnValueType (*func_two_param_exe) (Param1Type parameter1, Param2Type parameter2); 

     void Release(){ 

      if(params_allocated){ 

       if(pParam1 != nullptr) free(pParam1); 
       if(pParam2 != nullptr) free(pParam2); 

      } 

      if(this->command_exe != nullptr) this->command_exe->Release(); 

      delete this; // bye bye... 

     }; 

     VE_COMMAND_PABA* command_exe; // <- REFERENCE TO BASE CLASS 

     void execute(){ 

      switch(this->type){ 

       case VE_FCT_FUNC: 
        this->func_exe(); 
        break; 

       case VE_FCT_FUNC_PARAM: 
        this->func_param_exe((*(this->pParam1))); 
        break; 

       case VE_FCT_FUNC_TWO_PARAM: 
        this->func_two_param_exe((*(this->pParam1)), (*(this->pParam2))); 
        break; 

       default: 
        DebugBreak(); 
        break; 

      }; 

      if(this->command_exe != nullptr){ 

       this->command_exe->execute(); 

      } 

     }; 

}; 

template <typename ParentClassType, typename ReturnValueType, typename Param1Type, typename Param2Type> class VE_DERIVED_FUNC_COMMAND : public VE_COMMAND_PABA { 

    public: 

     enum VE_DERIVED_FUNC_COMMAND_TYPE { 

      VE_DFCT_FUNC, 
      VE_DFCT_FUNC_PARAM, 
      VE_DFCT_FUNC_TWO_PARAM, 

     } type; 

     Param1Type* pParam1; 
     Param2Type* pParam2; 

     Param1Type** lpParam1; 
     Param2Type** lpParam2; 

     bool params_allocated; 

     ParentClassType* pParent; 
     ParentClassType** lpParent; 
     ReturnValueType (ParentClassType::*child_func_exe)(); 
     ReturnValueType (ParentClassType::*child_param_exe) (Param1Type parameter); 
     ReturnValueType (ParentClassType::*child_func_two_param_exe) (Param1Type parameter1, Param2Type parameter2); 

     void Release(){ 

      if(params_allocated){ 

       if(pParam1 != nullptr) free(pParam1); 
       if(pParam2 != nullptr) free(pParam2); 

      } 

      if(this->command_exe != nullptr) this->command_exe->Release(); 

      delete this; // bye bye ... 

     }; 

     VE_COMMAND_PABA* command_exe; // <- REFERENCE TO BASE CLASS 

     void execute(){ 

      switch(this->type){ 

       case VE_DFCT_FUNC: 
        if(this->pParent != nullptr){ 

         (this->pParent->*this->child_func_exe)(); 

        }else{ 

         ((*(this->lpParent))->*this->child_func_exe)(); 

        } 
        break; 

       case VE_DFCT_FUNC_PARAM: 
        if(this->pParent != nullptr){ 

         (this->pParent->*this->child_param_exe)((*(this->pParam1))); 

        }else{ 

         ((*(this->lpParent))->*this->child_param_exe)((*(this->pParam1))); 

        } 
        break; 

       case VE_DFCT_FUNC_TWO_PARAM: 
        if(this->pParent != nullptr){ 

         (this->pParent->*this->child_func_two_param_exe)((*(this->pParam1)), (*(this->pParam2))); 

        }else{ 

         ((*(this->lpParent))->*this->child_func_two_param_exe)((*(this->pParam1)), (*(this->pParam2))); 

        } 
        break; 

       default: 
        DebugBreak(); 
        break; 

      }; 

      if(this->command_exe != nullptr){ 

       this->command_exe->execute(); 

      } 

     }; 

}; 
0

Это может быть сложно, но я думаю, что вы пытаетесь достичь/эксперимент следующим образом:

template <typename Type> 
using Func = void (myClass<Type>::*)(); 


template <typename Type> 
void fGiveMeYourClass(Func<Type> fptr) 
{ 

} 

Если я правильно понял, в простой и простой способ получить указатель на функцию член рабочей будет :

template <typename Type> 
void fGiveMeYourClass(const myClass<Type>& x) 
{ 
    (x.*x.func_exe)(); 
} 
+0

ну в принципе да, но я забыл упомянуть, что мне не нужен шаблон 'fGiveMeYourClass' (так как он приводит к тому, что полученный код выглядит нечистым и заставляет меня шаблонировать все, используя этот класс, когда все, что я хочу, является указателем на одну из его функций-членов) –

Смежные вопросы