簡體   English   中英

將代碼作為參數傳遞(C ++)

[英]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, ...)>是一個不錯的默認值,但你有幾個選擇:

  1. 聲明一個輔助函數並傳遞一個指向它的指針。 這是用C語言進行處理的唯一方法,也是在C ++ 98中實現它的常規方法。

     void example(void (*action)()) { action(); } void example_action() { std::cout << "action\\n"; } example(example_action); 
  2. 接受函數指針,並傳遞一個不捕獲任何變量的lambda。 Lambda在C ++ 11及更高版本中可用。

     void example(void (*action)()) { action(); } example([]() { std::cout << "action\\n"; }); 
  3. 接受可調用的模板類型參數(一個定義了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()); 
  4. 接受一個std::function對象,並傳遞一個可以捕獲變量的lambda。

     void example(std::function<void()> action) { action(); } int x = 4; example([x]() { std::cout << "action (" << x << ")\\n"; }); 
  5. 聲明一個輔助函數並在編譯時指向它。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM