2016-10-12 8 views
1

Ist es möglich, eine Template-Funktion zu erstellen, die ein variadisches Parameterpack von Funktionszeigern empfängt?C++ Template Pack für Funktionsargument

template<ReturnType (*FN)(), ReturnType (*FNX...)()> 
void run() { 
    ... 
    run<FNX...>(); 
    ... 
} 

Ich habe versucht, von der ... an allen Orten zu platzieren ich denken konnte, aber ich kann es nicht kompiliert bekommen. Wird das nicht unterstützt?

Antwort

2

können Sie diese Syntax verwenden, aber es sieht wirklich seltsam:

template<void(*... Functions)()> 
void call_all() 
{ 
    initializer_list<int>{(Functions(), 0)...}; 
} 

ich den Typ alias würde, aber:

template <typename T> 
using function_ptr = add_pointer_t<enable_if_t<is_function<T>::value,T>>; 

template<function_ptr<void()>... Functions> 
void call_all() 
{ 
    initializer_list<int>{(Functions(), 0)...}; 
} 

Sie auch Helfer-Klasse verwenden, können erweiterte Verarbeitung zu tun :

using fp = function_ptr<string()>; 

template<fp First, fp... Others> 
struct helper 
{ 
    static void run() 
    { 
     helper<First>::run(); 
     helper<Others...>::run(); 
    } 
}; 

template<fp One> 
struct helper<One> 
{ 
    static void run() 
    { 
     DBG(One()); 
    } 
}; 

template<fp... Functions> 
void run() 
{ 
    helper<Functions...>::run(); 
} 

live demo

+0

Großartig, aber wie kann ich das Paket an eine andere Vorlage weitergeben (wie in meinem Beispiel), ohne es auf tatsächliche Aufrufe zu erweitern? Ich muss die Funktionen einzeln aufrufen und ihren Rückgabetyp überprüfen, bevor sie den nächsten aufruft. Meine eigentliche Vorlage hat zwei Argumente, die erste Funktion und den Rest als Paket. – theduke

+0

@theduke Überprüfen Sie die Bearbeitung – krzaq

+0

Super, vielen Dank. Mit ftw ... – theduke

Verwandte Themen