我正在使用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函数返回“名称”或“值”的字符串。
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();
}

但是格式正确吗?

谢谢!

最佳答案

没有这样的办法

成员对象只是一个对象。一旦通过它,它只是一个int&std::string&。有零个上下文可以推断出它实际上是另一个对象的成员。

当然,如果您知道封闭的对象,则可以迭代所有融合适应的成员,并将地址与子对象member_value的地址进行比较,我不确定为什么要这么做,但是您就可以了。

关于c++ - 如何使用Boost fusion 获取特定元素的成员名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35161534/

10-11 22:42
查看更多