簡體   English   中英

可以通過boost獲得C ++匿名函數嗎?

[英]Possible to have C++ anonymous functions with boost?

我正在嘗試解決匿名函數變得更容易,更容易的問題,並且想知道這是否可以在c ++中實現。

我想做的是(基本上)

template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
    return one + dosomething(5);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

對於我必須做的事情,這個例子非常非常簡單。 在C#中我會做p => p * 5。 我知道這很容易用C ++ 0x,但我不能用它。 我覺得我應該能夠使用boost :: lambda,或使用占位符的boost :: bind和boost :: function的組合,但我似乎無法讓它工作。 這可能是不可能的,這也很好,但如果不可能請回答。 謝謝。

編輯:好吧,似乎int的簡單情況工作正常,一個更復雜的結構怎么樣? 所以,試試吧

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

這里我的C#表達式將與p => p.temp * 5一致。這是否可以在C ++中使用boost進行?

編輯2:好的,現在我只是好奇:D如何調用lambda表達式中的函數? 所以,如果我們有

int ChangeVal(int mult)
{
    return mult*5;
}

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

在C#中,我可以調用p => ChangeVal(p)。 C ++ lambda表達式的語法是什么?

正如Anders在他的回答中指出的那樣,boost :: lambda可能很有用,但在某些情況下代碼可能變得難以閱讀。 因此,它取決於您在匿名函數中要執行的操作。

對於你在問題中提到的p => p * 5這樣的簡單情況,在我看來,使用Lambda或Bind是合理的,但是:

DoSomething(1, _1 * 5);

編輯:您的第二個示例命中一個語法快速詳細的區域:成員(數據或函數)訪問。 因為“點”運算符不能在C ++中重載,所以必須使用綁定表達式從參數中獲取“x”:

DoSomething(1, bind(&NumHolder::x, _1) * 5);

或者,使用Boost.Lambda,使用重載 - > *運算符:

DoSomething(1, &_1->* &NumHolder::x * 5);

編輯2:好的,最后一次:)在你的上一個問題中,你用C#編寫,你會寫p => ChangeVal(p) ,但上面的代碼顯示一個ChangeVal采用int,而不是NumHolder,所以它是不清楚你的意思。

假設ChangeVal接受一個int並且您希望匿名函數執行相當於ChangeVal(the_arg.x) ,那么您可以使用Boost.Lambda編寫它:

DoSomething(1, bind(&ChangeVal, &_1->*&NumHolder::x));

或者使用Boost.Bind(也適用於Lambda):

DoSomething(1, bind(&ChangeVal, bind(&NumHolder::x, _1));

不,不可能以簡單的方式做到。 boost :: lambda可以提供幫助,但在我看來,使用它時代碼很難閱讀,所以我會避免使用它。

我認為相當於C# p=>p*5將是_1*5 ,但我只是簡單地看了它,所以我不確定。 對於簡單的東西,它可以工作,但是一旦你需要控制結構,你將不得不使用另一組控制結構,這些控制結構是基於功能的,而不是命令式的。 我發現這與普通的C ++代碼有很大不同,我自己決定不值得使用它,因為它使得代碼很難為其他人閱讀。

boost不會擴展c ++的語法。 c ++中沒有匿名函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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