迭代結構體和類別成員
在 C 中,可以迭代結構體或類別的成員來檢索它們的名稱和價值觀。以下是實現此目的的幾種方法:
使用巨集
REFLECTABLE 巨集可用於定義允許自省的結構。該巨集將結構體的成員定義為以逗號分隔的類型名稱對清單。例如:
struct A
{
REFLECTABLE
(
(int) a,
(int) b,
(int) c
)
};
定義結構體後,您可以使用訪客函數迭代其成員並列印它們的名稱和值:
struct print_visitor
{
template
void operator()(FieldData f)
{
std::cout
void print_fields(T & x)
{
visit_each(x, print_visitor());
}
A x;
print_fields(x);
將結構調整為融合序列
另一種方法是使用 BOOST_FUSION_ADAPT_STRUCT 巨集將結構調整為融合序列。此巨集將結構成員定義為具有對應類型和值的元素序列。例如:
struct A
{
int a;
int b;
int c;
};
BOOST_FUSION_ADAPT_STRUCT
(
A,
(int, a)
(int, b)
(int, c)
)
調整結構後,您可以使用範圍循環來迭代成員並列印它們的名稱和值:
struct print_visitor
{
template
void operator()(Index, C & c)
{
std::cout ::call()
(c)
void print_fields(C & c)
{
typedef boost::mpl::range_c::type::value> range;
boost::mpl::for_each(boost::bind(print_visitor(), boost::ref(c), _1));
}
這兩種方法都允許您內省結構和類,在運行時提供對其成員及其值的存取。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3