【发布时间】:2013-06-27 23:52:59
【问题描述】:
我想知道如何正确循环普通旧数据类型的成员,以便获取有关它们的一些类型信息。那就是:
struct my_pod
{
int a;
double b;
};
template<typename POD>
void loopOverPOD()
{
for_each(POD, member) // The magic part
{
// member::type should be for my_pod int, then double
typename member::type i;
// member::size_of should be equal to sizeof(int) then sizeof(double)
// Trivial if we can have member::type information.
int size = member::size_of;
// member::offset_of should be equal to 0, then sizeof(int)
// Trivial if we can have member::size_of information.
int offset = member::offset_of;
}
}
据我所知,在 C++ 中,如果不对模板进行一些棘手的操作,我们就无法进行简单的类型自省。但是在这里,我找不到使用模板的具体解决方案,即使实际上使用宏也是如此。问题更多是关于我,而不是关于解决方案的存在。 :-)
我不一定要求一个不会侵入的解决方案。
提前致谢。
【问题讨论】:
-
这是不可能的
-
您是否考虑过使用
std::tuple而不是POD 类型。 -
@CaptainObvlious 如果与 POD 模板参数一起使用,std::tuple 是否是 POD?
-
反射不是 C++ 语言的一部分。但它可以用外部工具来完成,参见例如Boost Reflect 库 (bytemaster.github.io/boost_reflect/…)。
-
您要解决的真正问题是什么?在某些语言中,您可以通过反射解决的许多问题在 C++ 中以不同方式解决。
标签: c++ templates introspection