7

是否可以使用模板元编程将任何结构或类转换为元组?

例如:

struct Foo
{
  char         c;
  int          i;
  std::string  s;
};

typedef std::tuple< char, int, std::string >  Foo_Tuple;

如果有一些模板代码会自动为我生成 Foo_Tuple 那就太好了。

回答

对于这样一个简单的情况,这有点过分了,但对于更复杂的情况(例如 ORM 或任何需要编写大量样板代码,而仅仅模板或宏不足以完成任务),Boost Mirror看起来它可能非常有用。我对 Boost Mirror 进行了深入研究:基本反射功能(在 Mirror 和 Puddle 中)并不难理解,很容易设置并且似乎相当广泛(可以处理许多结构,包括 C++11枚举类等...)。我发现这个基本功能已经绰绰有余——我可以使用 MACROS 来将我的类暴露给反射(这样我就不必编写样板代码)。工厂生成器似乎也非常强大(使用相同的初始宏设置,您可以交换任何您喜欢输出 JSON、SOCI 或流等的工厂生成器...),但学习曲线更大/ setup,如果你想编写自己的工厂生成器。最后几点注意事项:经过一些小的调整,我能够让它在 gcc 4.7.2 上与 C++11 一起工作;此外,文档已经很好地氧化了,似乎有足够多的例子可以快速开始。

4

1 回答 1

7

我认为在 C++ 中没有办法做到这一点。

我不知道枚举结构中的字段/类型的方法 - 如果你能做到这一点,我认为构造这样的元组将相当简单。

我相信 Boost.Fusion 有一个宏可以帮助解决这个问题,称为 FUSION_ADAPT_STRUCT,但这都是手动的。

这方面的技术术语是“反射”,您可以通过搜索“C++ 反射”找到很多关于它的信息。

这是一篇这样的文章:如何向 C++ 应用程序添加反射?

于 2012-12-15T06:42:16.643 回答