首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用由std::BOOST_FUSION_ADAPT_STRUCT组成的结构BOOST_FUSION_ADAPT_STRUCT吗?

我可以使用由std::BOOST_FUSION_ADAPT_STRUCT组成的结构BOOST_FUSION_ADAPT_STRUCT吗?
EN

Stack Overflow用户
提问于 2021-12-17 10:39:06
回答 1查看 206关注 0票数 2

我可以使用具有std::vector的结构类型'opt‘的“std::vector”吗?std::vector是用结构类型A实例化的,如下所示。

只是想知道是否允许这样做,还是我在试图使用BOOST_FUSION_ADAPT_STRUCT时犯了一些错误,在下面的用例中使用包含std::vector的结构?

代码语言:javascript
复制
struct NameValue
{
    NameValue(const std::string& _e) :e(_e)
    {};
    std::string e;
};

struct A
{
    std::string   name;
    boost::optional<bool> value;
    std::string   path;
    std::string   type;
};

BOOST_FUSION_ADAPT_STRUCT(A,
    (std::string, name)
    (boost::optional<bool>, value))
    (std::string, path)
    (std::string, type))        
    

struct opt : public NameValue
{
    opt() : NameValue("One")
    {};
    std::vector<A> s;
};

BOOST_FUSION_ADAPT_STRUCT(opt,
(std::vector<A>, s))
EN

回答 1

Stack Overflow用户

发布于 2021-12-17 15:13:41

你当然可以。宏不能很好地处理复杂的标记,所以添加parens。

请注意,您不必再在C++11中指定类型。

住在Coliru

代码语言:javascript
复制
#include <boost/fusion/adapted.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/optional.hpp>
#include <boost/optional/optional_io.hpp>
#include <string>
#include <vector>

namespace MyLib {
    struct A {
        std::string           name;
        boost::optional<bool> value;
        std::string           path;
        std::string           type;
    };

    struct NameValue {
        NameValue(std::string e) : e(std::move(e)){};
        std::string e;
    };

    struct opt : public NameValue {
        opt() : NameValue("One"){};
        std::vector<A> s;
    };

    using boost::fusion::operator<<;
} // namespace MyLib

BOOST_FUSION_ADAPT_STRUCT(MyLib::A, name, value, path, type)
BOOST_FUSION_ADAPT_STRUCT(MyLib::opt, s)

#include <iostream>
int main() {
    std::cout << std::boolalpha;
    MyLib::opt o;
    o.s = {
        {"name1", true,        "path1", "type1"},
        {"name2", boost::none, "path2", "type2"},
        {"name3", false,       "path3", "type3"},
    };

    for (auto& el : o.s) {
        std::cout << el << "\n";
    }
}

打印

代码语言:javascript
复制
(name1  true path1 type1)
(name2 -- path2 type2)
(name3  false path3 type3)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70391871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档