[英]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);
};
分別使用Var1
和Var2
。 我們甚至可以單獨使用Var1
和Var2
使用以下類型:
struct Visitor3 {
void operator()(A);
void operator()(B);
void operator()(C);
void operator()(D);
};
但什么OP缺少的是,我們希望能夠訪問四對一(A,C)
(A,D)
(B,C)
(B,D)
-在看一對時Var1
和Var2
在一起 。 這就是為什么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.