Использование шаблонных функций C ++ удаленно - PullRequest
0 голосов
/ 19 октября 2011

В настоящее время у меня есть объект, который реализует сложную систему для хранения и чтения объектов конфигурации нескольких типов, которые могут быть легко использованы локально:

template <typename T>
void rdData(std::string path, T& ref);

template <typename T>
void wrData(std::string path, T& ref);

int value;
rdData("tree1.scalar", value);
struct my_struct;
wrData("tree1", my_struct);

Тип T может быть примитивным типом данных, илиPOD C Struct, определенный в отдельном файле, скажем, legal_structs.c.Этот файл, определяющий структуры, со временем увеличивается по мере добавления новых структур.Если используется неправильный тип, генерируется исключение.

Однако теперь мы хотим использовать одну и ту же систему одновременно несколькими другими процессами.Это может быть сокеты, RPC или обмен сообщениями.

Есть ли способ определить тип объекта поверх сокетов, как это делают шаблоны?Например, клиенты будут делать:

remote_rdData(path, data);

И данные будут переданы в виде необработанных байтов на сервер, на котором работает наша система.На стороне сервера должен быть способ определить тип данных и вызвать локальную функцию шаблона с соответствующим типом.Пока что единственный способ, который я вижу, - это передать идентификатор объекта (например, его type_info), и на сервере есть огромный переключатель, сравнивающий type_infos и вызывающий для каждого объекта.Однако его необходимо добавлять каждый раз, когда в систему добавляется новая структура.

Существует ли более автоматический способ восстановления объектов на стороне сервера?

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Шаблоны ничего не делают во время выполнения.Они раскрываются во время компиляции.Если вы собираетесь десериализовать объект из потока, вы должны иметь возможность вызывать некоторый код для создания правильного типа на основе кода типа, считанного из потока.Шаблоны не имеют к этому никакого отношения.

Наиболее мощным решением часто является генерация кода - просто напишите простой инструмент, который генерирует для вас некрасивый оператор switch, и включите его в процесс сборки.

0 голосов
/ 20 октября 2011

Я думаю, что сериализация (например, в boost ) может помочь.Помимо распознавания объектов есть также некоторые функции, которые вы можете найти полезными (например, управление версиями, эффективность, переносимость ...)

...