2013-06-30 39 views
3

我想知道如何正确循环一个普通的旧数据类型的成员,以获得他们的一些类型信息。那就是:循环POD成员

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++中,我们不能做简单的类型内省而不做一些棘手的戏剧与模板。但在这里,我无法找到具体的解决方案,即使事实上使用了宏。问题更多的是关于我而不是解决方案的存在。 :-)

我不一定要求一个不会侵入的解决方案。

在此先感谢。

+1

这是不可能做 –

+1

你有没有考虑过使用['std :: tuple'](http://en.cppreference.com/w/cpp/utility/tuple)而不是POD类型。 –

+0

@CaptainObvlious是否std :: tuple是POD,如果与POD模板参数一起使用? – Nemikolh

回答

3

您可以使用boost.fusions 将您的POD转换为序列,然后使用融合for_each将函数对象应用于每个成员。这是非侵入性的,你的POD类型将保持POD。

好的是,您甚至可以将ADAPT_STRUCT宏放入与您的结构定义分开的(header-)文件中,并且只在需要迭代的代码中使用它们。

另一方面,这个宏需要重复提及成员的类型和名称。我想在某些时候,融合将使用C++ 11功能来摆脱冗余(再次提及类型)。同时,可以创建一个声明结构和ADAP_STRUCT部分的宏。

+0

正是我需要的!非常感谢。即使宏被说成是邪恶的,但对于POD类型来说,它们看起来并不那么邪恶。 – Nemikolh

0

C++没有构造来遍历结构的成员。

然而,存在一个标准类型std::tuple,您可以使用模板在编译时递归遍历其元素。