2015-11-12 14 views
5

ho wrapper che invoca funzione template N volte:C++ 11 args variadic con valore di argomento di funzione di default

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 
} 

Tutto funziona bene fino a quando mi passa funzione con argomento di default:

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

Come consentire l'uso dell'argomento predefinito senza specifiche esplicite?

+0

'retry_fn <10> ([] (auto ... x) {return f (x ...);}, 1, 2) ' –

+0

@ ᐅ JohannesSchaub-litb ᐊ sì è ovvia soluzione – Dewfy

risposta

2

Un parametro predefinito non fa parte della firma di una funzione e non partecipa alla deduzione del tipo di modello. Quindi, ogni volta che si passa f a retry_n<>, il tipo di viene dedotto come int(int, int, int), quindi lo f locale è di quest'ultimo tipo e i parametri predefiniti non sono più disponibili. La tua unica soluzione è usare la funzione che vuoi testare direttamente senza dedurre il suo tipo, come nel commento di @Johannes Schaub - litb, o, se il tuo compilatore non supporta lambdas generico (C++ 14), avvolgilo in un funtore con un modello variadic operator()

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

e usarlo come

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

Grazie per la risposta tecnicamente corretta. Ho cercato su http://stackoverflow.com/a/27687037/149818 e ho la sensazione che 'std :: enable_if_t' possa essere applicato lì – Dewfy

+0

@Dewfy Hmmm, potrebbe essere, si prega di inviare una risposta se si trova un soluzione, il problema è interessante. – vsoftco

Problemi correlati