2015-11-12 14 views
5

Mam otoki, który wywołuje funkcji szablonu razy N:C++ 11 o zmiennej liczbie argumentów args z domyślnej wartości argumentów funkcji

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 
} 

wszystko działa w porządku, dopóki nie przejdzie funkcję z argumentem domyślnym:

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

Jak aby zezwolić na użycie domyślnego argumentu bez jawnej specyfikacji?

+0

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

+0

@ ᐅ JohannesSchaub-litb ᐊ tak, jest jasne, obejście problemu – Dewfy

Odpowiedz

2

Parametr domyślny nie jest częścią sygnatury funkcji i nie uczestniczy w odliczaniu typu szablonu. Tak więc za każdym razem, gdy przechodzisz od f do retry_n<>, typ F jest wyprowadzany jako int(int, int, int), więc lokalny f jest tego ostatniego typu, a domyślne parametry są obecnie poza procesem. Twoim jedynym rozwiązaniem jest użycie funkcji, którą chcesz przetestować bezpośrednio, bez wyprowadzania jej typu, jak w komentarzu @Johannes Schaub - litb, lub, jeśli twój kompilator nie obsługuje ogólnych lambd (C++ 14), zawiń to w funktora o zmiennej liczbie argumentów szablonu operator()

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

i używania go jako

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

Dziękujemy za technicznie poprawną odpowiedź. Patrzę na http://stackoverflow.com/a/27687037/149818 i mam wrażenie, że 'std :: enable_if_t' może być tam zastosowany – Dewfy

+0

@Dewfy Hmmm, może być, proszę napisać odpowiedź, jeśli znajdziesz rozwiązanie, problem jest interesujący. – vsoftco

Powiązane problemy