TMP:如何编写将任何结构转换为元组的模板代码?

时间:2012-12-15 06:21:10

标签: c++ templates c++11 tuples

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

例如:

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

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

最好有一些模板代码可以自动为我生成Foo_Tuple。

ANSWER

这对于这样一个简单的案例来说太过分了,但是对于更复杂的案例(例如ORM或任何时候你需要编写大量的样板代码,而单纯的模板或宏不足以完成任务),{{ 3}}看起来它可能非常有用。我更多地挖掘了Boost Mirror:基本的反射功能(在Mirror和Puddle中)不难理解,很容易设置并且看起来相当广泛(可以处理许多构造,包括C ++ 11枚举类等...)。我发现这个基本功能已经足够了 - 我可以使用MACROS到我希望将我的类暴露给Reflection的程度(这样我就不必编写样板代码)。 Factory生成器似乎也非常强大(使用相同的初始宏设置,您可以交换任何您想要输出JSON,SOCI或流等的工厂生成器...),但具有更大的学习曲线/设置,如果你想编写自己的工厂发电机。最后几个注释:通过一些小的调整,我能够在gcc 4.7.2上使用C ++ 11;此外,文档已经充分加氧,似乎有足够的例子可以快速进行。

1 个答案:

答案 0 :(得分:7)

我认为没有办法在C ++中实现这一目标。

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

我相信Boost.Fusion有一个宏,可以帮助这个FUSION_ADAPT_STRUCT,但这些都是手动的。

这个技术术语是&#34;反射&#34;,你可以通过搜索&#34; C ++反射&#34;找到很多关于它的信息。

这里有一篇这样的文章:How can I add reflection to a C++ application?