2016-06-13 9 views
0

Angenommen, ich habe eine Klasse bar mit mehreren Implementierungen von Verfahren foo:Erhalten Parametertypen aller Funktionen Überlastungen

struct bar { 
    void foo(int, int); 
    void foo(float, bool); 
    void foo(const vector<void*>&); 
} 

Gibt es für mich eine Möglichkeit, eine Liste von Listen von Argumenten Typen zu erhalten? Mit anderen Worten, ich definiere

template<typename... types> class list {}; 

und möchte list<list<int, int>, list<float, bool>, list<const vector<void*>&>> erhalten.

+1

Ah, der mythische 'invocation_traits' Vorschlag ... –

+0

@KerrekSB das klingt nicht viel Erleichterung ... –

+0

Welche Art von Schnittstelle erwarten Sie? Wie nur "bar" zur Verfügung stellen und die "Liste" bekommen? Nun, .... – Arunmu

Antwort

2

Nr

Sie die Frage stellen kann "kann ich anrufen bar.foo mit int, long args?". Sie können die Frage stellen "Gibt es eine &Bar::foo Methode des Typs void (Bar::*)(int, int)?", Aber keiner entspricht Ihren Anforderungen.

Eine andere Sache, die Sie tun können, ist Perfect Forward in bar.foo und tun sogar SFINAE Tests so Ausfall führt zu einem Versagen bei der Weiterleitung Schnittstelle zu übermitteln, die nicht in deren Umsetzung.

Wenn Sie eine endliche Liste von Typen und max. Anzahl von Argumenten haben, können Sie die Menge der Überladungen für diejenigen, die funktionieren, oder für exakte Signaturübereinstimmungen zu O (T^N) Kosten auswerten.

Als Editorial hat Ihre Frage den üblichen Fehler bei Fragen dieser Art, wo Sie eine bestimmte technische Herausforderung beschreiben und nicht einmal das Problem, das diese Aufgabe lösen soll, beiläufig beschreiben. Es ist tatsächlich schockierend, wie zuverlässig die "Ich möchte über die Funktionssignaturüberladung nachdenken" -Fragen, niemals, freiwillig, das spezielle Problem, das ihre Reflexion beheben soll. Viele, viele solcher Probleme haben Lösungen, die keine vollständige Reflexion zu lösen brauchen.

+0

Ja, danke, ich überlege mir jetzt eine Frage zu meinem speziellen Problem zu stellen. Aber da ist die andere Seite der Medaille: Mein spezielles Problem ist viel zu spezialisiert, um bei SO zu fragen (ich kann nicht mal einen Titel kurz genug finden), und es wird sehr ähnlich aussehen "bitte schreibe den Code für mich ". –

+0

@TigranSaluev Ich finde es am besten zu beschreiben, was dich auf deinem Weg zum Fix * und * zumindest eine vage Beschreibung davon enthält, warum du versuchst zu tun, was du als effizient zu tun versuchst. – Yakk