2015-11-12 34 views
5

私はテンプレート関数N回を呼び出すラッパーありますC++ 11個の可変長引数

template <std::uint16_t N, typename F, typename ... Args> 
inline typename std::result_of<F && (Args &&...)>::type retry_n(F && f, Args&& ... ax) 
{ 
    for (auto i = 0; i < N; ++i) 
    { 
     try 
     { 
      return std::forward<F>(f)(std::forward<Args>(ax)...); 
     } 
     catch (const some_except &e){ /*ignore exception for a while*/ } 
    } 
    throw;//re-raise 
} 

を私はデフォルトの引数で関数を渡すまで、すべてが正常に動作します:

どう
int f(int a, int b, int c = 5); 
.... 
retry_n<10>(f, 1, 2); // error C2198: 'bla-bla' : too few arguments for call 

明示的な指定なしにデフォルトの引数を使用できるようにするには?

+0

として 'retry_fn <10>([](オート... x)は、それを使用してファンクタに{戻りF(Xを...);} 1、2) ' –

+0

@ᐅJohannesSchaub-litbᐊはいこれは明確な回避策です。 – Dewfy

答えて

2

デフォルトのパラメータは、関数のシグネチャの一部ではなく、テンプレート型推論に参加しません。あなたはretry_n<>fを渡すたびローカルfは、この後者のタイプのものであり、デフォルトパラメータは、現在のプロセスの外にあるので、だから、Fの種類は、int(int, int, int)と推定されます。唯一の解決策は、@ Johannes Schaub-litbのコメントのように、型を推測することなく直接テストしたい関数を使うことです。コンパイラが汎用ラムダ(C++ 14)をサポートしていない場合はラップしてください可変長テンプレートoperator()

struct functor 
{ 
    template<typename... T> 
    int operator()(T&&... params) 
    { 
     return f(std::forward<T>(params)...); 
    } 
}; 

retry_n<10>(functor{}, 1, 2); 
+0

技術的に正解ありがとうございます。私はhttp://stackoverflow.com/a/27687037/149818を見て、 'std :: enable_if_t'がそこに適用できるという気持ちを持っています。 – Dewfy

+0

@Dewfy Hmmm、もしそうなら、答えを投稿してください。解決策は、問題は面白いです。 – vsoftco

関連する問題