2016-06-18 9 views
2

std :: functionとlambdaを比較するにはどうすればよいですか?std :: functionとlambdaの比較

#include <iostream> 
#include <functional> 
using namespace std; 

int main() 
{ 
    using Type = void(float, int); 
    std::function<Type> a; 
    auto callback = [](float d, int r) 
    { 
     cout << d << " " << r << endl; 
    }; 
    static_assert(std::is_same< Type , decltype(callback) >::value, "Callbacks should be same!"); 


    a(15.7f, 15); 
} 

ラムダの第parametrの場合にintされるため - コードは1回の警告でコンパイルだろう。コードを保護する方法は?

答えて

4

callbackの種類は単純な機能ではありません。キャプチャのないラムダは、関数ポインタに崩壊する可能性がありますが、関数ポインタではありません。これはローカルクラスのインスタンスです。

あなたは、ラムダのための特定の機能の種類を確認したい場合は、ポインタ型を機能させる減衰を強制していることを行うことができます。

#include <iostream> 
#include <functional> 
using namespace std; 

int main() 
{ 
    using Type = void(float, int); 
    std::function<Type> a; 
    auto callback = [](float d, int r) 
    { 
     cout << d << " " << r << endl; 
    }; 

    // Ensures desired type. 
    { 
     Type* const func_ptr = callback; (void) func_ptr; 
    } 

    a = callback; 
    a(15.7f, 15); 
} 
+0

こんにちは、ラムダ・キャプチャーこのまたは他のいくつかの変数の場合 - 比較は常にあります偽です。それを修正するには? – rikimaru2013

+1

@ rikimaru2013:キャプチャでは、関数型(それがない)への崩壊を使用することはできません。したがって、一般的な場合には非常に扱いにくくなります。しかし、私が理解しているように、あなたの主な目標は、第一引数のための**変換の縮小**を避けることです。実際の引数は少なくともfloatです。次に、上記のチェックを '(void)sizeof(callback({1.0f}、0)、0);'で置き換えることができます。 –

+0

私は* formal *の引数が少なくともfloatであることを意味しました。ごめんなさい。いくつかの痛み、不明瞭または二重の考え。 –

関連する問題