15

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

我的问题是:

有没有人见过任何项目/decumentation(不仅仅是XML)使用这样的技术(模板元编程)来模拟Java和C#等语言中使用的注释概念,然后可以在代码生成中使用(有效地自动化使用声明式风格的任务)。

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

4

4 回答 4

7

最近,我看了以下内容:

好好阅读:)

于 2009-12-10T21:43:28.413 回答
2

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

Andrei Alexandrescu 现代 C++ 设计通用编程和设计模式应用 Addison-Wesley,美国,2001 ISBN 0-201-70431-5

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

于 2009-12-10T22:43:36.590 回答
1

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

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

如果我们定义一些虚拟宏,这甚至可以在具有线性扫描算法的 C/C++ 工具中完成。

模板可以抽象类实例化,在此之上我们添加了侵入式 RTTI。

我对这个问题的回答中描述了该技术的完整描述

如何在 C++ 中实现序列化

于 2012-04-26T12:16:00.057 回答
0

Boost.Serialization就是答案。它为序列化自定义类型引入了所需的便携式 RTTI。

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

于 2011-04-22T10:34:09.753 回答