【问题标题】:TMP: how to write template code which converts any struct into a tuple?TMP:如何编写将任何结构转换为元组的模板代码?
【发布时间】: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 将适用于大多数平台。
  • 我不认为reinterpret_cast 会起作用(通常),因为tuple 的不同实现对成员的布局不同。特别是,一种实现可能使用char, int, string,而另一种可能使用string, int, char
  • @John Kugelman 我确实感觉很糟糕,我确实。
  • @jamesBrock,它不适用于任何平台上的 Gnu libstdc++,因为 Gnu 元组以相反的顺序排列。 clang libc++ 具有标准顺序的元组元素,但它并不常用。我不知道其他标准库实现是做什么的;大概他们中的大多数人都做其中之一。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 看起来在 C++ 得到反射之前,其中一些库可以做到(至少它可以防止大量样板代码)。
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多