2011-04-22 10 views
4

ラムダをファンクションに渡したいと思います。パラメータでラムダを渡す

この

boost::function<void()> fncPtr(boost::bind<void>([](){/* something */})); 

作品が、ラムダは、パラメータを持っていた場合、私はそれを正しく行うには方法がわからない:

boost::function<void(bool)> 
fncPtr(boost::bind<void,bool>([](bool){/* something */}, _1)); 

は動作しません。

どこが間違っていますか? 引数を指定してlambdaを渡すには?

私はこれをメンバー関数で行いたいと思います。 "グローバルスコープ"(それは名前ですか?)上のこのメソッドは正常に動作します。

+0

関数のパラメータは何ですか? – Xeo

+0

ええええええ、私はこれも動作しない理由を把握することはできません。 (もちろん、提示された簡単な例では、 'bind'にラムダをラップする必要はありませんが、それはほとんど問題ではありません) –

答えて

0

おそらくコンパイラに問題があります。 Visual Studio 2010にもエラーがあります。コンパイラがラムダをヘルパー関数を使って関数に変換するのを助けることができます:

template <typename T> 
void closureToFunction(bool x){ T f; return f(x); } 

int main() 
{ 
    auto exp = [](bool x){/* something */}; 
    boost::function<void(bool)> fncPtr( 
     boost::bind(closureToFunction<decltype(exp)>, _1)); 
    return 0; 
} 
2

いくつかの手法をまとめました。注意しておきますが、私はC++ 0xバージョンを使用しましたが、Boostのものもうまく動作するはずです。
本当にあなたの関数がパラメータとして望んでいるものに依存します。単純にテンプレート化されている場合、または(std::|boost::)functionが必要な場合は、単純なラムダが行います。複雑な綴じや梱包の必要はありません。余分に(std::|boost::)function

+1

C++のバージョンでは、' 'は必要ありません。 'bind'は戻り値の型を' result_of :: type'(または同様のもの)として宣言します。 boostは戻り値の型を推測するための 'decltype'のような光沢のあるものをすべて持っていないので、lambdaは提供しない関数子によって提供される' result_type'型定義に依存します。 –

+0

@Johannes:ありがとう、ラムダはそれらを提供していないことを知ることは面白いです。理由の根拠は?なぜなら 'decltype'のためにC++ 0xのためにもうこれを必要としないからです。 – Xeo

3

これはGCC4.5と私のために正常に動作します:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 

int main() { 
    boost::function<void(bool)> 
    fncPtr(boost::bind<void>([](bool){/* something */}, _1)); 
} 

それはパラメータの種類を必要としません。これらのパラメータ型は、とにかく(いくつかのファンクタのために)テンプレート化される可能性があるため、一般的にはそれらに依存することはできません。戻り値の型だけが必要です。

ちなみに、私が<void, bool>を渡すと、それは私のために働くのですが、lambdasにはキャプチャがないときだけです。 lambdaにキャプチャ句がない場合、GCC4.5が関数ポインタ型へのlambdaの変換をサポートしているので、これは私にとってはうまくいくと思います。 <void, bool>は、bindに関数ポインタを受け取り、ラムダをそれに変換する候補を持つようにします。あなたのコンパイラはまだ特別な変換をサポートしていません(しかしFDISはそれを必要とします)。

したがって、ちょうど<void>を渡すだけで動作するはずです。

関連する問題