Есть ли способ обрабатывать переменное количество параметров в классе шаблона? - PullRequest
5 голосов
/ 01 октября 2008

У меня есть набор классов обратного вызова, которые я использую для обработки обратных вызовов с переменным числом параметров. Прямо сейчас у меня есть около 6 различных экземпляров для обработки различного количества аргументов. Есть ли способ сделать один экземпляр, который может обрабатывать переменное количество аргументов? В конечном счете, я бы хотел, чтобы каждый параметр был POD-типом или указателем класса или структурным указателем. Есть идеи?

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);
};

Ответы [ 4 ]

5 голосов
/ 01 октября 2008

Еще не в самом языке, но C ++ 0x будет иметь поддержку шаблонов переменных .

3 голосов
/ 01 октября 2008

C ++ 0x variatdic шаблоны - ваш лучший выбор, но пройдет некоторое время, прежде чем вы сможете их использовать.

Если вам нужны последовательности типов сегодня, взгляните на MPL vector типов, а также на другие типы последовательностей типов. Это часть библиотеки Boost . Он позволяет вам предоставить аргумент шаблона, представляющий собой последовательность типов, а не только один тип.

0 голосов
/ 02 августа 2012

Мой первый выбор - использовать boost :: bind, boost :: function или std :: bind / std :: function и / или c ++ 11 лямбда-выражений для достижения вашей цели. Но если вам нужно свернуть свой собственный функтор, я бы использовал boost fusion для создания «слитого функтора», который принимает один аргумент шаблона.

http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

В конечном итоге все эти библиотеки используют макросы препроцессора, чтобы перечислить все возможные варианты, чтобы обойти отсутствие вариабельных шаблонов.

0 голосов
/ 01 октября 2008

Как насчет обхода этой проблемы с помощью Boost Bind ? Вы можете заставить свой код принимать один аргумент или вообще ни одного аргумента и связывать нужные аргументы на сайте вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...