您如何在语法上更方便地使用std :: variants?

问题描述 投票:0回答:1

这是我给新手用户提供的答案的动力,我建议他们使用std::variant代替联合。

使用工会,您可能会遇到以下类似问题:

std::variant

((不完全是原始问题的意思,我在这里取得了一些诗意的许可。)并且使用一个变体,该类可能看起来像这样:

struct Box {
    struct Item { float value; };
    using Boxes = std::vector<Box>;

    union Value {
        Item item;
        Boxes boxes;
    };

    Value contents;
    std::string label;
};

事实是,有了第一个变体,我可以写

struct Box {
    struct Item { float value; };
    using Boxes = std::vector<Box>;

    std::variant<Item, Boxes> contents;
    std::string label;
};

并且只要已经建立了子框,它就会起作用。

使用if (box.contents.boxes.size() > 2) { foo(); } ,我必须写:

std::variant

我觉得第二个版本的可读性差很多,有点混乱,而且分散了注意力。另外-我必须知道if (std::get<Boxes>(box.contents).size() > 2) { foo(); } 的类型。

在我的代码中,我该怎么做,以免我的用户需要进行此类boxes通话,并使他们的生活更愉快?

c++ c++17 idiomatic syntactic-sugar std-variant
1个回答
0
投票

只需添加一些包装std::get()的访问器:

std::get

然后它去了:

struct Box {
    struct Item { float value; };
    using Boxes = std::vector<Box>;

    std::variant<Item, Boxes> contents;
    std::string label;

    decltype(auto) item() { return std::get<Item>(contents); }
    decltype(auto) item() const { return std::get<Item>(contents); }

    decltype(auto) boxes() { return std::get<Boxes>(contents); }
    decltype(auto) boxes() const { return std::get<Boxes>(contents); }
};
© www.soinside.com 2019 - 2024. All rights reserved.