[英]Passing code as an argument (C++)
我如何將代碼塊傳遞給C ++中的函數。 在C#中,我可以這樣做:
void Example(Action action)
{
action();
}
Example(() => {
//do something
});
非常感謝所有幫助和提示。
這是一個簡單的例子來開始......
void Example(void (*x)(void))
{
x();
}
這個電話會......
Example([] { cout << "do something\n"; });
這與您的C#示例非常相似。 正如評論所暗示的那樣,有更好,更多樣化的方式。 如果您想要返回一個值並獲取參數,您可以執行以下操作...
int Example2(int (*y)(int i), int p)
{
return y(p);
}
// ...
auto ret = Example2([](int p) -> int { cout << p << "\n"; return p; }, 2);
這與C#版本類似,如下所示
int Example2(Func<int,int> y, int p)
{
return y(p);
}
// ...
var ret = Example2((p) => { /*etc*/ return p; }, 2);
C ++ 11等價物將是:
void Example(const std::function<void()>& action)
{
// always good to make sure that action has a valid target
if(action != nullptr)
action();
}
Example([] {
//do something
});
std::function<Result(Param1, Param2, ...)>
是一個不錯的默認值,但你有幾個選擇:
聲明一個輔助函數並傳遞一個指向它的指針。 這是用C語言進行處理的唯一方法,也是在C ++ 98中實現它的常規方法。
void example(void (*action)()) { action(); } void example_action() { std::cout << "action\\n"; } example(example_action);
接受函數指針,並傳遞一個不捕獲任何變量的lambda。 Lambda在C ++ 11及更高版本中可用。
void example(void (*action)()) { action(); } example([]() { std::cout << "action\\n"; });
接受可調用的模板類型參數(一個定義了operator()
),並傳遞可捕獲變量的lambda或任何其他可調用對象(“functor”)。
template<class F> void example(F action) { action(); } int x = 4; example([x]() { std::cout << "action (" << x << ")\\n"; }); struct example_action { void operator()() { std::cout << "action\\n"; } }; example(example_action());
接受一個std::function
對象,並傳遞一個可以捕獲變量的lambda。
void example(std::function<void()> action) { action(); } int x = 4; example([x]() { std::cout << "action (" << x << ")\\n"; });
聲明一個輔助函數並在編譯時指向它。
template<void (*action)()> void example() { action(); } example<example_action>();
與任何模板一樣,#3將為您調用它的每個操作類型生成example
的特殊化,因此它可能會增加您的二進制大小,但它沒有運行時開銷。 #4將在運行時為閉包分配空間,但只會在二進制文件中生成一個example
定義。 #5是罕見的,但它允許傳入函數受益於內聯等優化。
使用std::function<void()>
而不是Action
和lambda函數的C ++語法:
void Example(std::function<void()> action)
{
action();
}
Example([]() {
//do something
});
與帶有函數指針的@Les的解決方案相比, std::function
允許您傳遞捕獲上下文的lambdas,以及通常任何其他類型的可調用對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.