2013-05-03 4 views
13

はラムダを返して次の関数を考えてみましょう:STDなしラムダを返す::機能

std::function<int()> make_counter() 
{ 
    int i = 0; 
    return [=]() mutable { return i++; }; 
} 

ことが可能ですstd::functionにそれをラップせず、実際のラムダ型を返すために?

答えて

18

C++ 11:いいえ。すべてのラムダ式は、私が(5.1.2/3)を引用しています

[...] ユニーク、無名の非組合クラス型[ ...]

これは実質的に、対応する式を知らなくてもラムダの型を知ることができないことを意味します。

ここで何もキャプチャしなかった場合は、関数ポインタへの変換を使用してそのポインタ(関数ポインタ型)を返すことができますが、それはかなり限定的です。

auto const make_counter = [](int i = 0) { 
    return [i]() mutable { return i++; }; 
}; 

:あなたは make_counter(と、それはないテンプレート、または過負荷状態、または何かである場合)、次のように動作しますを置き換えるために喜んでいる場合

は@Lucは、ラウンジで述べたように

C++ 1y:はい、通常の関数(N3582)の戻り値型控除を使用します。

+1

ラムダ式は有効なC++ 11ではありません。本文に 'return expression;(§5.1.2,4) –

+0

以上のものが含まれていると、戻り値の型減算は機能しません。技術的には、基本的に同等のものを再実装する' my_not_STD_function'を返すことができます。 – Yakk

+1

@Arne:Blame編集のためのOP:... Pが修正されました。 – Xeo

10

返品タイプ控除をご利用の場合はyes you can (Link)です。

これはC++ 11自体を超えてのみ可能ですが、ラムダ(つまり、そのlambaを返すラムダ内のラムダ)を使用して、通常の警告ではなくC++ 11で実行できます。 。

+0

Not C++ 11、(まだ)標準ではありません。 – Xeo

+0

ええ、C++はまだ遅いです。 = [ –

+0

@Fred再びリンクを見て、コンパイルに使用したコマンドラインに注意してください。 –