2016-10-30 17 views
1

std::functionを返す関数を実装しようとしていますが、これは任意の数のパラメータを取得する可能性があります。可変長std ::関数を使用したC++ 11の関数シグネチャ

私は以下を試しましたが、コンパイルされず、エラーの意味を理解できません。

template <typename ...Args> 
void ThrowOnError(std::function<int(Args...)> func, Args... args) 
{ 
    int err = func(args...); 
    if (err < 0) 
     throw std::exception(); 
} 

int f() 
{ 
    return 42; 
} 

int f(int x) 
{ 
    return x; 
} 


int main() 
{ 
    ThrowOnError(f); 
    ThrowOnError(f, 1); 
} 

私はヘッダにテンプレート機能を移動しようとしたが、それは動作しませんでした、私はf(int x)機能をコメントアウトしてのみだけfでコールを残す場合も、私はまだno matching overloaded function found'void ThrowOnError(std::function<int(Args...)>,Args...)': could not deduce template argument for 'std::function<int(Args...)>' from 'int (int)'

を取得ここでの問題は何ですか?私はこの機能で何が欠けていますか?

P.S - 私は可能な限りstd::functionを受け取り、ファンクタタイプに別のタイプ名を追加しないようにしたいと思います。

答えて

4

std::functionをパラメータとして提供せず、控除を行うことはできません。
他の場所では、std::functionに機能を割り当てるには、実際のタイプを知っている必要があります。それを見つけるためには、控除が行われなければならない。控除が発生するには、最初に関数ポインタをstd::functionに割り当てる必要がありますが、後者のタイプは不明です(控除はまだ行われていないため)。
このようにループします。あなたがこれを行うとき

はまた、:

ThrowOnError(f); 

をそれはあなたが使用したいものをf知っているコンパイラのために不可能です。
あなたは、むしろこのような何か行う必要があります。

ThrowOnError(std::function<int()>{static_cast<int(*)()>(f)}); 

またはこの(あなたがファンクタのために別のテンプレートパラメータを使用することを受け入れる場合):

ThrowOnError(static_cast<int(*)()>(f)); 

あなたが右から機能を拾っている。この方法をオーバーロードは明示的に設定され、コンパイラはあなたの意図を推測することはできません。
述べたように、それは次のようにもThrowOnError機能を変更するために受け入れるならば、後者は正常に動作します:

template <typename F, typename ...Args> 
void ThrowOnError(F func, Args... args) 
{ 
    int err = func(args...); 
    if (err < 0) 
     throw std::exception(); 
} 

あるいはさらに良い:

template <typename F, typename ...Args> 
void ThrowOnError(F &&func, Args&&... args) 
{ 
    int err = std::forward<F>(func)(std::forward<Args>(args)...); 
    if (err < 0) 
     throw std::exception(); 
} 
+0

OK、これは動作しません'typename F、typename ... Args'も同様です。どのように達成することができますか? – ZivS

+0

@ZivS詳細を追加しました。答えのために – skypjack

+0

ありがとう。あなたの編集について:http://english.stackexchange.com/questions/1016/do-you-use-a-or-an-before-acronyms – ZivS

関連する問題