У меня есть несколько функций, которые считывают различные типы из сериализованных данных, например:
class DataDeserializer
{
int getInt();
std::string getString();
MyClass getMyClass();
}
Затем у меня есть различные функции обратного вызова, которые принимают произвольные параметры, например:
void callbackA (int, int, int);
void callbackB (int, std::string);
void callbackC (std::string, int, MyClass, int);
Я хочу вызывать различные обратные вызовы с аргументами, считанными из потока десериализованных данных. Я хотел бы максимально автоматизировать шаблонный код. Я подумал, может быть, я мог бы использовать шаблоны. Если бы у меня был какой-то класс Dispatcher, например:
template <SOMETHING??> class Dispatcher
{
void dispatch()
{
// ????
}
SOMEFUNCTIONTYPE callback;
DataDeserializer myDeserializer;
};
Затем объявите различные конкретные диспетчеры:
Dispatcher<int,int,int> myDispatcherA (deserializer, callbackA);
Dispatcher<int,std::string> myDispatcherB (deserializer, callbackB);
Dispatcher<std::string,int,MyClass,int> myDispatcherC (deserializer, callbackC);
Затем, когда я хочу отправить, я просто звоню:
myDispatcherB.dispatch();
который внизу расширится до чего-то вроде этого:
void dispatch()
{
callback (myDeserializer.getString(), myDeserializer.getInt(), myDeserializer.getMyClass(), myDeserializer.getInt());
}
Возможно ли это с вариативными шаблонами С++ 11? Я немного читал о них, и кажется, что рекурсия используется много.
stream_function
(найденный здесь) может помочь. - person Xeo   schedule 17.09.2013