【发布时间】:2012-12-15 06:21:09
【问题描述】:
是否可以使用模板元编程将任何结构或类转换为元组?
例如:
struct Foo
{
char c;
int i;
std::string s;
};
typedef std::tuple< char, int, std::string > Foo_Tuple;
如果有一些模板代码会自动为我生成 Foo_Tuple,那就太好了。
回答
这对于这样一个简单的案例来说是多余的,但对于更复杂的案例(例如 ORM 或任何你需要编写大量样板代码,而仅仅模板或宏不足以完成任务),@987654321 @ 看起来它可能非常有用。我对 Boost Mirror 进行了深入研究:基本的反射功能(在 Mirror 和 Puddle 中)并不难理解,很容易设置并且似乎相当广泛(可以处理许多结构,包括 C++11枚举类等...)。我发现这个基本功能已经绰绰有余——我可以使用 MACROS 来将我的类暴露给反射(这样我就不必编写样板代码)。工厂生成器似乎也非常强大(使用相同的初始宏设置,您可以交换任何您喜欢输出 JSON、SOCI 或流等的工厂生成器...),但学习曲线更大/ setup,如果你想编写自己的工厂生成器。最后一点:通过一些小的调整,我能够让它在 gcc 4.7.2 上与 C++11 一起工作;此外,文档已经很好地进行了 Doxygenated,并且似乎有足够多的示例可以快速上手。
【问题讨论】:
-
我知道我会因为建议而受到强烈谴责,但我认为在这种情况下
reinterpret_cast将适用于大多数平台。 -
@JamesBrock 嘘!嘶! Your suggestion's bad and you should feel bad!
-
我不认为
reinterpret_cast会起作用(通常),因为tuple的不同实现对成员的布局不同。特别是,一种实现可能使用char, int, string,而另一种可能使用string, int, char。 -
@John Kugelman 我确实感觉很糟糕,我确实。
-
@jamesBrock,它不适用于任何平台上的 Gnu libstdc++,因为 Gnu 元组以相反的顺序排列。 clang libc++ 具有标准顺序的元组元素,但它并不常用。我不知道其他标准库实现是做什么的;大概他们中的大多数人都做其中之一。
标签: c++ templates c++11 tuples