C++声明式解析序列化

发布于 2024-08-14 02:37:29 字数 1016 浏览 4 评论 0原文

看看 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# 等语言中使用的注释概念,然后可以使用它们在代码生成中(通过使用声明式风格有效地自动化任务)。

目前,在我的研究中,我正在寻找更多的阅读材料和示例。

Looking at Java and C# they manage to do some wicked processing based on special languaged based anotation (forgive me if that is the incorrect name).

In C++ we have two problems with this:

1) There is no way to annotate a class with type information that is accessable at runtime.
2) Parsing the source to generate stuff is way to complex.

But I was thinking that this could be done with some template meta-programming to achieve the same basic affect as anotations (still just thinking about it). Like char_traits that are specialised for the different types an xml_traits template could be used in a declaritive way. This traits class could be used to define how a class is serialised/deserialized by specializing the traits for the class you are trying to serialize.

Example Thoughs:

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 */ }

My question is:

Has anybody seen any projects/decumentation (not just XML) out there that uses techniques like this (template meta-programming) to emulate the concept of annotation used in languges like Java and C# that can then be used in code generation (to effectively automate the task by using a declaritive style).

At this point in my research I am looking for more reading material and examples.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

你的背包 2024-08-21 02:37:29

最近,我看了以下内容:

好好阅读:)

Lately, I had a look at the following:

Have a good read :)

幸福丶如此 2024-08-21 02:37:29

有一本关于使用 C++ 模板处理器的非常好的书:

Andrei Alexandrescu 现代 C++ 设计
通用编程和设计
应用艾迪生韦斯利模式,
美国,2001 ISBN 0-201-70431-5

Andrei 开始使用 C++ 模板编写程序!

There is a really good book on using the C++ template processor:

Andrei Alexandrescu Modern C++ Design
Generic Programming and Design
Patterns Applied Addison-Wesley,
U.S.A., 2001 ISBN 0-201-70431-5

Andrei starts writing programs using C++ templates!

ㄟ。诗瑗 2024-08-21 02:37:29

模板元编程是一个非常强大的工具,但事情很简单:您只需发明自己的附加语法来描述属性。

是的,解析 C++ 很难,但我们只需要有限的解析能力:读取类列表
包含层次结构信息和所有序列化属性的列表。

如果我们定义一些虚拟宏,即使在具有线性扫描算法的 C/C++ 工具中也可以完成此操作。

模板可以抽象类实例化,并在其之上添加侵入式 RTTI。

该技术的完整描述在我对此问题的回答

如何在 C++ 中实现序列化中进行了描述

The template metaprogramming is a really powerful tool, but the thing is simple: your just have to invent your own additional syntax for describing properties.

Yes, parsing C++ is hard, but we only need the limited parsing capabilities: read the class list
with hierarchy information and the list of all the serialized properties.

This can be done even in a C/C++ tool with a linear scanning algorithm, if we define some dummy macros.

Templates can abstract the class instantiation and on top of that we add the intrusive RTTI.

The complete description of the technique is described in my answer to this question

How to implement serialization in C++

紫轩蝶泪 2024-08-21 02:37:29

Boost.Serialization 就是答案。它引入了序列化自定义类型所需的可移植 RTTI。

C++ 中的运行时反射怎么样 - 这是一个单独的问题。

Boost.Serialization is the answer. It introduces required portable RTTI for serialization custom types.

What about runtime reflection in C++ - it's a separate question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文