在下面的代碼中,我有一個名爲data
的變量。它內部包含一個函數來稍後調用它們。假設data
在另一個庫中定義,我無法更改其類型。我爲其中每個已知函數的一部分(s3
)的成員分配模板函數,並且在調用函數時必須給出一部分函數(true
)。我能不能通過這樣的事情:如何用已知的函數參數來避免lambda函數?
data[0]=test_func(?,s3); // error
相反,我要傳遞一個lambda函數給它:
data[0]=[](bool b){test_func(b,s3);}; // ok
但lambda函數看起來並不整齊尤其是當我們有100數組這些任務。有沒有辦法通過以任何方式更改test_func
來避免lambda函數?即使使用test_func
內的lambda也對我來說是可以的,因爲它只寫了一次。
#include <iostream>
#include <functional>
template<typename F>
void test_func(bool b,F f)
{
if(b)
f();
}
void s1()
{
std::cout<<"s1 \n";
}
void s2()
{
std::cout<<"s2 \n";
}
void s3()
{
std::cout<<"s3 \n";
}
int main()
{
test_func(true,s1);
test_func(true,s2);
test_func(false,s1);
test_func(true,s2);
/////////////////
std::function<void(bool)> data[100];
// data=test_func(?,s3); // error
data[0]=[](bool b){test_func(b,s3);}; // ok
data[0](true);
return 0;
}
這不只是'的std ::函數 foo(F f){return [](bool b){test_func(b,f); }; }'? –
melpomene
現在,最好的解決方案是簡單地使用lambda函數。 'std :: bind'試圖做到這一點,但使用它需要學習它的迷你語言(對於任何讀取代碼的人),並且往往會使編譯器難以優化。此外,它最終只比lambda函數短。 – Justin
@melpomene,你如何適應這個代碼? – ar2015