我使用boost fusion库来识别结构中的所有成员。我相信boost::fusion::extension::struct_member_name<MembersList, Index::value>::call()
已经提供了会员名称。但有没有办法让这个名字在这个结构之外,而不需要将另一个参数传递给除member_value之外的函数?
template <typename MembersList>
struct Struct
{
Struct(const MembersList& members) : mMembers(members)
{
}
template <typename Index>
void operator() (Index idx) const
{
std::string field_name = boost::fusion::extension::struct_member_name<MembersList, Index::value>::call();
const auto& member_value = boost::fusion::at<Index>(mMembers);
getName(member_value); // function that returns the name of member_value
}
};
让我们说我们正在处理的结构定义如下,我希望getName
函数返回一个名称&#39;的字符串。或者&#39;价值&#39;。
BOOST_FUSION_DEFINE_STRUCT(
(NameSpace),
Members,
(string, name)
(int, value)
)
修改
有没有办法设置结构,以便我可以在外面访问field_name
变量?也许有像
template <typename MembersList>
struct Struct
{
std::string field_name;
template <typename Index>
void operator() (Index idx) const
{
field_name = boost::fusion::extension::struct_member_name<MembersList, Index::value>::call();
}
std::string getName(){
return field_name;
}
};
void someFunction() {
std::string name = getName();
}
但是格式正确吗?
谢谢!
答案 0 :(得分:1)
没有这样的方式
成员对象只是一个对象。一旦你传递了它,只需int&
或std::string&
。没有上下文可以推断出它实际上是不同对象的成员。
当然,如果您知道封闭对象,您可以迭代所有融合适应成员并将地址与子对象member_value
的地址进行比较我不知道为什么你想要那个,但是你去了。