C++ 环绕吊舱成员
我想知道如何正确地循环一个普通的旧数据类型的成员,以便获得关于它们的一些类型信息。即:C++ 环绕吊舱成员,c++,templates,introspection,C++,Templates,Introspection,我想知道如何正确地循环一个普通的旧数据类型的成员,以便获得关于它们的一些类型信息。即: 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
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;
}
}
struct my_pod
{
INTA;
双b;
};
模板
void loopOverPOD()
{
每个(豆荚,成员)//魔法部分
{
//member::type应该是my_pod int,然后是double
typename成员::type i;
//member::的size_应等于sizeof(int)然后等于sizeof(double)
//如果我们可以有member::type信息,那就很简单了。
int size=member::size\u of;
//成员::的偏移量_应等于0,然后是sizeof(int)
//如果我们可以拥有信息的member::size\u,那就很简单了。
int offset=成员::offset_of;
}
}
<> P>正如我在C++中所知道的那样,在不做一些棘手的模板操作的情况下,我们不能进行简单的类型内省。但在这里,我找不到一个模板的具体解决方案,即使使用了宏。问题更多的是关于我,而不是关于解决方案的存在。:-)
我并不是在要求一个不会造成干扰的解决方案
提前感谢。C++没有可以迭代结构成员的构造
然而,存在一个标准类型
std::tuple
,您可以使用模板在编译时递归迭代其元素。您可以使用boost.fusions将POD转换为序列,然后使用fusions将函数对象应用于每个成员。这是非侵入性的,您的POD类型将保持为POD
好的是,您甚至可以将ADAPT_STRUCT宏放在与结构定义分开的(头)文件中,并且只在需要迭代的代码中使用它们
另一方面,这个宏需要重复提及成员的类型和名称。我想fusion会在某个时候使用C++11特性来消除冗余(再次提到类型)。同时,还可以创建一个宏来声明结构和ADAP_结构部分。如果使用C++14及更高版本,可以使用
Boost.Precise and Flat Reflection
()在POD上循环,并使用Boost::typeindex::type_id_runtime(field)
打印类型:
#include <iostream>
#include <boost/pfr/precise.hpp>
#include <boost/pfr/flat.hpp>
#include <boost/type_index.hpp>
struct my_pod
{
int a;
double b;
};
struct my_struct
{
char c;
my_pod pod;
};
int main() {
my_pod val{1, 2.5};
my_struct var{'a', 1, 2.5};
std::cout << "Flat:\n";
boost::pfr::flat_for_each_field(var, [](const auto& field, std::size_t idx) {
std::cout << idx << ": " << boost::typeindex::type_id_runtime(field) << "; value: " << field << '\n';
});
std::cout << "\nNot Flat:\n";
boost::pfr::for_each_field(var, [](const auto& field, std::size_t idx) {
using namespace boost::pfr::ops;
std::cout << idx << ": " << boost::typeindex::type_id_runtime(field) << "; value: " << field << '\n';
});
}
虽然我不知道如何在这种情况下得到偏移……/P>这是不可能考虑使用而不是POD类型的。@ CaseBoovivysSTD::tuple是一个POD,如果与POD模板参数一起使用?反射不是C++语言的一部分。但这可以通过外部工具来完成,例如Boost Reflect Library()。您试图解决的真正问题是什么?你可以用一些语言来解决的许多问题在C++中被不同地解决了。谢谢。即使宏被认为是邪恶的,对于POD类型来说,它们看起来也不是那么邪恶。
Flat:
0: char; value: a
1: int; value: 1
2: double; value: 2.5
Not Flat:
0: char; value: a
1: my_pod; value: {1, 2.5}