为了更加熟悉C++ 17,我刚刚注意到 std::visit :

template <class Visitor, class... Variants>
constexpr /*something*/ visit(Visitor&& vis, Variants&&... vars);

为什么std::visit不采用单个变体,而是采用任意数量的变体?我的意思是,您始终可以使用一些标准库函数,并以相同的角色使用多个参数,并对所有参数进行处理(例如,容器中多个元素的std::find());否则您可能会吸引多个访客,并在同一个变体上使用他们。

那么,为什么要进行这种特定的“变异化”?

最佳答案

为了使多次访问更清洁。假设我有两个std::variant<A,B>,一个名为left和一个名为right。多次访问,我可以写:

struct Visitor {
    void operator()(A, A);
    void operator()(A, B);
    void operator()(B, A);
    void operator()(B, B);
};

std::visit(Visitor{}, left, right);

这是一个非常干净的界面,并且通常非常有用。有效实现也很容易-您只需创建一个n维的函数数组即可,而不是一维的数组。

另一方面,只需单次访问,​​您就必须编写:
std::visit([&](auto l_elem){
    std::visit([&](auto r_elem){
        Visitor{}(l_elem, r_elem);
    }, right)
}, left);

这样写起来很痛苦,阅读起来很痛苦,而且效率可能也很低。

关于c++ - 为什么std::visit采用可变数量的变体?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43811741/

10-11 23:04
查看更多