템플릿 클래스에서 가변 수의 매개 변수를 처리하는 방법이 있습니까?
-
03-07-2019 - |
문제
가변 수의 매개 변수로 콜백을 처리하는 데 사용하는 콜백 클래스 세트가 있습니다. 지금은 다른 인수의 인수를 처리하기 위해 약 6 개의 다른 사례를 가지고 있습니다. 가변 수의 인수를 처리 할 수있는 것보다 하나의 인스턴스를 만드는 방법이 있습니까? 궁극적으로 각 매개 변수를 포드 유형 또는 클래스 포인터 또는 구조 포인터로 만들고 싶습니다. 어떤 아이디어?
template <class T>
class kGUICallBackPtr
{
public:
kGUICallBackPtr() {m_obj=0;m_func=0;}
void Set(void *o,void (*f)(void *,T *));
inline void Call(T *i) {if(m_func) m_func(m_obj,i);}
inline bool IsValid(void) {return (m_func!=0);}
private:
void *m_obj;
void (*m_func)(void *,T *);
};
template <class T,class U>
class kGUICallBackPtrPtr
{
public:
kGUICallBackPtrPtr() {m_obj=0;m_func=0;}
void Set(void *o,void (*f)(void *,T *,U *));
inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);}
inline bool IsValid(void) {return (m_func!=0);}
private:
void *m_obj;
void (*m_func)(void *,T *,U *j);
};
해결책
아직 언어 자체는 아니지만 C ++ 0X는 지원합니다. 변수 템플릿.
다른 팁
사용을 통해이 문제를 회피하는 것은 어떻습니까? 부스트 바인드? 코드가 단일 인수 또는 전혀 아무것도 수락하고 전화 사이트에서 필요한 인수를 바인딩 할 수 있습니다.
나의 첫 번째 선택은 boost :: bind, boost :: function 또는 std :: bind/std :: function 및/또는 c ++ 11 lambda를 사용하여 목표를 달성하는 것입니다. 그러나 자신의 functor를 굴려야한다면 Boost Fusion을 사용하여 단일 템플릿 인수를 취하는 '융합 untictor'를 만듭니다.
궁극적으로 이러한 모든 라이브러리는 사전 프로세서 매크로를 사용하여 다양한 템플릿이 부족하여 가능한 모든 옵션을 열거합니다.
제휴하지 않습니다 StackOverflow