【问题标题】:How to get the member name of specific element using boost fusion如何使用 boost fusion 获取特定元素的成员名称
【发布时间】:2016-02-02 18:51:22
【问题描述】:

我正在使用 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();
}

但是格式正确吗?

谢谢!

【问题讨论】:

    标签: c++ templates boost member


    【解决方案1】:

    没有办法

    成员对象只是一个对象。一旦你传递它,它只是一个int&amp;std::string&amp;。零上下文可以推断它实际上是不同对象的成员。

    当然,如果你知道你的封闭对象可以迭代所有融合适应的成员并将地址与子对象的地址进行比较member_value我不知道你为什么想要那个,但是你去。

    【讨论】:

    • 我完全期待你的可靠回答,因为这是不被接受的 :) 请注意,可以像我画的那样完成,但它都不会回答提出的问题,也没有我没有心情实施它
    • 我只是想要一些非常简单直接的东西。由于没有其他答案,我想没有简单的解决方案,所以我再次接受了您的答案。谢谢。
    猜你喜欢
    • 2020-08-26
    • 2023-04-07
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2011-11-07
    • 2021-09-17
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多