2017-11-08 10 views
3

このオブジェクトを呼び出すための特定の関数または関数オブジェクトと引数をとり、完璧な転送を使用して呼び出す関数(apply_args()と呼ぶ)を書き込もうとしました。関数にargsを適用するためのテンプレート関数

例:

auto fun = [](std::string a, std::string const& b) { return a += b; }; 

std::string s("world!"); 

// s is passing by lvalue ref, 
// temporary object by rvalue ref 
s = apply_args(fun, std::string("Hello, "), s); 

どのように私はその機能を実装することができますか?あなたは(関数ポインタでそれを変換する)+funとしてfunラムダを渡すために受け入れた場合

+0

それを書くことから学びたいと思っているので、これを書こうとしているのですか?それを望むので書きたいのですか? 2番目の場合は、代わりに['std :: invoke'](http://en.cppreference.com/w/cpp/utility/functional/invoke)を使うべきでしょう。 –

+0

@DanielH - 'std :: invoke'は良い選択ですが、C++ 17です。この質問にはタグが付けられていますC++ 11 – max66

+0

@DanielH最初のもの – user1786089

答えて

3
template <typename Func, typename ...Args> 
decltype(auto) apply_args(Func &&f, Args &&...args) { 
    return f(std::forward<Args>(args)...); 
} 
+1

C++ 14のために良い;質問にはC++ 11タグが付いています。 (自動返り値)(Func && f、Args && ... args) - > decltype(f(std :: forward (args)...)) ' – max66

+0

@Andrei R.ありがとう! – user1786089

+0

@ max66ありがとう! – user1786089

0

、私はあなたが簡単に書くことができると仮定しapply_args()

template <typename R, typename ... Fts, typename ... As> 
R apply_args (R(*fn)(Fts...), As && ... as) 
{ return fn(std::forward<As>(as)...); } 

としてフル例

#include <string> 
#include <iostream> 
#include <functional> 

template <typename R, typename ... Fts, typename ... As> 
R apply_args (R(*fn)(Fts...), As && ... as) 
{ return fn(std::forward<As>(as)...); } 

int main() 
{ 
    auto fun = [](std::string a, std::string const& b) { return a += b; }; 

    std::string s("world!"); 

    s = apply_args(+fun, std::string("Hello, "), s); 

    std::cout << s << std::endl; 
} 
+1

末尾の戻り値の型と 'decltype'を使用すると、最初のパラメータの型を指定する必要はなく、' Fラムダでは特別なことをする必要はありません(また、 'operator()'やキャプチャ付きのlambdaを持つオブジェクトのように、関数ポインタに変換できないものを扱うこともできます)。 –

+0

@DanielH - 作品。良い解決策(私のものより良い)が本当に違います。あなたはそれを別の答えとして提案するべきです。 – max66

+0

あなたの解決策は呼び出し可能なオブジェクトでは機能しません –

関連する問題