2016-12-01 6 views
2

は私がのstd ::機能を使用して、戻り値の型がジェネリックしたいのですが、それはコード、機能しません。 デバッグコードを見つけることができます:http://cpp.sh/5bk5std :: functionから戻り値の型を推測する方法は?

class Test 
{ 
public: 
    template <typename R, typename F = std::function<R()>> 
    R f(F&& op) { 
    op(); 
    } 

    void t() { 
    int a = 10; 
    f([this, a]() { return "chars"; }); 
    } 
}; 

int main() 
{ 
    t::Test test; 
    test.t(); 
    return 0; 
} 
+0

ためdecltype()を使用する必要が

// Example program #include <iostream> class Test { public: Test(){ } template <typename F> auto f (F && op) { return op(); } void t() { std::cout << f([this]() { return "chars"; }) << std::endl; } }; int main() { Test test; test.t(); return 0; } 

簡単です戻り値の型で? –

+0

void *を使ってみましたか?それはジェシックタイプを持つCishの方法です。 – mgarey

答えて

2

は、テンプレートを避けることができ/ std::function方法戻り値の型にはautoを使用します。

あなたがC++ 14をコンパイルすることができれば、それはあなたが唯一のC++ 11をコンパイルすることができた場合は、多分得るために `result_of`を使用Test::f()

template <typename F> 
    auto f (F && op) -> decltype(op()) 
    { return op(); } 
関連する問題