簡體   English   中英

為什么std :: visit采用可變數量的變體?

[英]Why does std::visit take a variable number of variants?

為了更加熟悉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);

這樣寫起來很痛苦,閱讀起來很痛苦,而且效率可能也較低。

因為我們需要允許訪問變體內的類組合 也就是說,如果我們有

using Var1 = std::variant<A,B>;
using Var2 = std::variant<C,D>;

我們顯然可以使用以下類型的訪問者:

struct Visitor1 {
    void operator()(A);
    void operator()(B);
};

struct Visitor2 {
    void operator()(C);
    void operator()(D);
};

分別使用Var1Var2 我們甚至可以單獨使用Var1Var2使用以下類型:

struct Visitor3 {
    void operator()(A);
    void operator()(B);
    void operator()(C);
    void operator()(D);
};

但什么OP缺少的是,我們希望能夠訪問四對一(A,C) (A,D) (B,C) (B,D) -在看一對時Var1Var2 在一起 這就是為什么std::visit的可變參數完全必要的原因。 合適的訪問者如下所示:

struct Visitor4 {
    void operator()(A,C);
    void operator()(A,D);
    void operator()(B,C);
    void operator()(B,D);
};

我們將調用std::visit(Visitor4{}, my_var1_instance, my_var2_instance);

在閱讀巴里的答案時,我發現了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM