Есть ли способ обрабатывать переменное количество параметров в классе шаблона?

StackOverflow https://stackoverflow.com/questions/154780

Вопрос

У меня есть набор классов обратного вызова, которые я использую для обработки обратных вызовов с переменным количеством параметров.Сейчас у меня есть около 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);
};
Это было полезно?

Решение

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

Другие советы

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

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

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

Моим первым выбором было бы использовать 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top