c++ - TMP : how to write template code which converts any struct into a tuple?

标签 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 就好了。

回答

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

最佳答案

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

我不知道如何枚举结构中的字段/类型 - 如果您可以这样做,我认为构建这样的元组会相当简单。

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

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

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

关于c++ - TMP : how to write template code which converts any struct into a tuple?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13889934/

相关文章:

c++ - 在多线程 C++ 服务器应用程序中处理非常量全局配置

c++ - 当返回一个没有 RVO 的类/结构时会发生什么?

c++ - C++ 中转换函数模板参数推导的含义

c++ - 在模板类的 constexpr 函数中找到正确的宏常量

c++ - 我创建了一个库,想知道设计是否效率低下

c++ - 私有(private)变量依赖于未指定的私有(private)变量(C++)

c++ - upcast 对象的地址

c++ - 当我在 'class' 定义之外时,如何编写此模板规范

php - 如何在不渲染 Twig 模板的情况下分析它们?

sockets - 如何测试两个本地套接字之间的数据传输