C ++ декларативная сериализация
-
19-09-2019 - |
Вопрос
Глядя на Java и C#, им удается сделать какую -то нечестивую обработку на основе специальной анотации на основе языков (простите меня, если это неверное имя).
В C ++ у нас есть две проблемы с этим:
1) Невозможно аннотировать класс с помощью информации типа, которая доступна во время выполнения.
2) Расположение источника для создания вещей - это путь к сложным.
Но я думал, что это можно сделать с помощью некоторых метапрограммирования шаблонов, чтобы достичь того же базового аффекта, что и анотации (все еще просто думая об этом). Как char_traits, которые специализируются на различных типах, шаблон XML_TRAITS может использоваться в качестве заявления. Этот класс признаков может быть использован для определения того, как класс сериализован/десериализован путем специализации признаков для класса, который вы пытаетесь сериализовать.
Пример, хотя:
template<typename T>
struct XML_traits
{
typedef XML_Empty Children;
};
template<>
struct XML_traits<Car>
{
typedef boost::mpl::vector<Body,Wheels,Engine> Children;
};
template<typename T>
std::ostream& Serialize(T const&)
{
// my template foo is not that strong.
// but somthing like this.
boost::mpl::for_each<typename XML_Traits<T>::Children,Serialize>(data);
}
template<>
std::ostream& Serialize<XML_Empty>(T const&)
{ /* Do Nothing */ }
Мой вопрос:
Кто-нибудь видел какие-либо проекты/декаментацию (не только XML), которые используют такие методы (мета-программирование шаблонов) для эмуляции концепции аннотации, используемой в лагугах, таких как Java и C#, которая затем может использоваться в генерации кода (для эффективного автоматизации автоматизации автоматизации. задача с помощью заявления).
На данный момент в моем исследовании я ищу больше материалов для чтения и примеров.
Решение
В последнее время я посмотрел на следующее:
- Ночная инициатива который сделал доступную систему отражения C ++
- Система типа времени выполнения C ++ Avi Bar-Zeev
- Сообщения в блоге о размышлении в C ++ (1, 2, 3) от Maciej Sinilo
Хорошо прочитать :)
Другие советы
Есть действительно хорошая книга об использовании шаблон -процессора C ++:
Andrei Alexandrescu Modern C ++ Дизайн
Андрей начинает писать программы, используя шаблоны C ++!
Метапреграммирование шаблона - это действительно мощный инструмент, но дело просто: вам просто нужно изобретать свой собственный дополнительный синтаксис для описания свойств.
Да, диапазон C ++ является Трудно, но нам нужны только ограниченные возможности анализа: прочитайте список классов с информацией иерархии и списком всех сериализованных свойств.
Это может быть сделано даже в инструменте C/C ++ с алгоритмом линейного сканирования, если мы определим некоторые фиктивные макросы.
Шаблоны могут абстрагировать классовую экземпляр, и, кроме того, мы добавляем навязчивые RTTI.
Полное описание техники описано в моем ответе на этот вопрос
Boost.serialization это ответ. Он вводит требуемые портативные RTTI для пользовательских типов сериализации.
Как насчет отражения времени выполнения в C ++ - это отдельный вопрос.