拆包

2013-03-07 35 views
2

對於每一個我需要申請兩個嵌套函數參數可變參數模板參數:拆包

obj.apply(someFilter(arg)); // arg is one argument, but here 
          // should be an unpacking of args 

我不知道怎麼寫拆包這種情況。

我看到這一點:

pass{([&]{ std::cout << args << std::endl; }(), 1)...}; 

on wiki,卻又不知道怎樣應用這個對於我的情況。

+0

當你說開箱時,你的意思是你的單參數'arg'應該被解壓到多個參數中? – souldzin 2013-03-07 16:53:57

回答

3

這其實很簡單: 你可以把任意表達式的可變參數模板參數包的解包內:

obj.apply(someFilter(arg))... 

這會給你的obj.apply爲昏迷分隔列表的結果。然後您可以將其傳遞給虛擬函數:

template<typename... Args> swallow (Args&&...) {} 
swallow(obj.apply(someFilter(arg))...); 

要吞下逗號分隔列表。

當然,這假設obj.apply返回某種對象。如果沒有,你可以使用

swallow((obj.apply(someFilter(arg)), 0)...); 

,使實際(非void)參數

如果你不知道什麼obj.apply`返回(結果可能重載逗號操作符),您可以禁用使用自定義的逗號操作符的使用

swallow((obj.apply(someFilter(arg)), void(), 0)...); 

如果您確實需要評估,以便在項目(這似乎不是來自這個問題很有可能),你可以濫用數組初始化語法,而不是使用一個函數調用:

using Alias=char[]; 
Alias{ (apply(someFilter(args)), void(), '\0')... }; 
+0

錯誤 - 表達式包含未展開的參數包'args'錯誤 - 預期';'在表達後 – user14416 2013-03-07 16:57:16

+0

@ user14416:它是否仍然給我編輯的錯誤?我無意中在結束之前發佈了答案。 – Grizzly 2013-03-07 16:59:48

+0

不,謝謝,現在沒事! – user14416 2013-03-07 17:00:49

0

我假設代碼有多個arg s作爲參數包?嘗試:

obj.apply(someFilter(arg)...); 

爲參數拆包適用於表達,所以參數包獲取的每個元素擴展到someFilter(arg)

0

這裏是做對的參數組動作的任意一組健壯的方式。它遵循最小驚訝的原則,不會爲了操作:

template<typename Lambda, typename Lambdas> 
void do_in_order(Lambda&& lambda, Lambdas&& lambdas) 
{ 
    std::forward<Lambda>(lambda)(); 
    do_in_order(std::forward<Lambdas>(lambdas)...); 
} 

void do_in_order() {} 

template<typename Args> 
void test(Args&& args) { 
    do_in_order([&](){obj.apply(someFilter(std::forward<Args>(args)));}...); 
} 

基本上,你在do_in_order送了一堆的lambda表達式,其中前評估他們回來。