Использование шаблонных функций C++ удаленно
В настоящее время у меня есть объект, который реализует сложную систему для хранения и чтения объектов конфигурации нескольких типов, которые могут быть легко использованы локально:
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, определенной в отдельном файле, скажем, legal_structs.c. Этот файл, определяющий структуры, со временем увеличивается по мере добавления новых структур. Если используется неправильный тип, генерируется исключение.
Однако теперь мы хотим использовать одну и ту же систему одновременно несколькими другими процессами. Это может быть сокеты, RPC или обмен сообщениями.
Есть ли способ определить тип объекта по сокетам, как это делают шаблоны? Например, клиенты будут делать:
remote_rdData(path, data);
И данные будут переданы в виде необработанных байтов на сервер, на котором работает наша система. На стороне сервера должен быть способ определить тип данных и вызвать локальную функцию шаблона с соответствующим типом. Пока что единственный способ, которым я вижу, - это передать идентификатор объекта (например, его type_info), и на сервере есть огромный переключатель, сравнивающий type_infos и вызывающий для каждого объекта. Однако его нужно будет добавлять каждый раз, когда в систему добавляется новая структура.
Есть ли более автоматический способ сделать эту реконструкцию объектов на стороне сервера?
2 ответа
Шаблоны ничего не делают во время выполнения. Они раскрываются во время компиляции. Если вы собираетесь десериализовать объект из потока, вы должны иметь возможность вызывать некоторый код для создания правильного типа на основе кода типа, считанного из потока. Шаблоны не имеют к этому никакого отношения.
Наиболее мощным решением часто является генерация кода - просто напишите простой инструмент, который сгенерирует для вас некрасивый оператор switch, и включите его в процесс сборки.
Я думаю, что сериализация (например, в Boost) может помочь. Помимо распознавания объектов, есть также некоторые функции, которые вы можете найти полезными (например, управление версиями, эффективность, переносимость...)