2016-06-08 19 views
1

這是後續我剛纔討論的另一個問題boost variant simple call to common methods增強變體訪問者預定義爲具有參數的全局lambda

由於有建議的想法,我可以做

boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, variant); 

我延長了想法,現在我有:

auto visitor = [](auto const& element) { return element->do_something(); }; 

爲全局變量和訪問過它很簡單:

boost::apply_visitor(visitor, variant); 

我的問題是如何擴展這種模式,如果可能的話可以使用它接受添加的lambdas自相矛盾的論點。假設我有:

auto visitor = [](auto const& element, int a) { return element->do_something(a); }; 

boost::apply_visitor(<some visitor magic with passing a>, variant); 

請注意,在定義lambda時沒有任何東西可以捕捉到。

+0

我沒有看到你以前的問題,這個問題之間的區別......答案是完全相同一樣。你能幫我嗎? – Rakete1111

+0

第一個問題是我如何將相同的代碼應用於所有類型。這個問題是關於傳遞參數。 – gsf

+0

不是。你問在使用'boost :: apply_visitor'時如何傳遞一個額外的參數,與此處相同 – Rakete1111

回答

1

請注意,在定義lambda的時候沒有任何東西可以捕捉到。

以後可以定義它,或者在通話的時刻定義另一個:

auto visitor = [](auto const& element, int a) { return element->do_something(a); }; 

// ... with possible usage of visitor 

const int b = ...; 
boost::apply_visitor([&](auto const& element) {visitor(element, b);}, variant); 
+0

這些都是很好的選擇,但我完成了一個完整的訪客類,接受構造函數中的參數,允許我執行'boost :: apply_visitor(visitor(b),variant);'。請注意,重複使用實現很容易使用模板方法。我剛剛忍受着'如果你只有一把錘子,一切看起來像是釘子'綜合徵。 – gsf