2017-11-29 2 views
1

Zum Beispiel haben wir einige C++ - Code, wo einige Funktionen eine andere Funktion mit einigen Parametern ausführen.Wie kann man bestimmte überladene Funktionen anzeigen?

#include <iostream> 
using namespace std; 

template <typename T, typename F> 
void todo(const T& param, const F& function) 
{ 
    function(param); 
} 

void foo(int a) 
{ 
    cout << a << endl; 
} 

int main() 
{ 
    int iA = 1051; 

    todo(iA, foo); 

    return 0; 
} 

Aber wenn wir noch eine Funktion mit dem Namen hinzufügen foo

void foo(double a) 
{ 
    cout << a << endl; 
} 

Dann Compiler weiß nicht, auf die eine Funktionsvorlage erzeugen.

!!! Wichtig !!!

Dies ist kein echter Code, es ist nur ein Beispiel. Problem konkret in pass reloaded Funktion als Argument.

Kann jemand bestimmte Funktion explizit angeben?

Antwort

3
todo(iA, static_cast<void (*)(int)>(&foo)); 

ist ein Weg, auf Kosten der Lesbarkeit an der Anrufstelle.

Prüfregeln (Ihre 2 Zeichen Vertiefung Halte - Ich bin ein Scherge):

#include <iostream> 
using namespace std; 

template <typename T, typename F> 
void todo(const T& param, const F& function) 
{ 
    function(param); 
} 
void foo(double a) 
{ 
    cout << "double " << a << endl; 
} 

void foo(int a) 
{ 
    cout << "int " << a << endl; 
} 

int main() 
{ 
    int iA = 1051; 

    todo(iA, static_cast<void (*)(int)>(&foo)); 
    todo(iA, static_cast<void (*)(double)>(&foo)); 

    return 0; 
} 

Ausgänge:

int 1051 
double 1051 

Siehe https://www.ideone.com/DEiLBE

+0

Nun, einfach 'static_cast' funktioniert auch. Ich bin froh, bessere Antworten zu lesen, sie zeigen mir, ich habe so viel noch zu lernen :) – YSC

+0

Wie ich 'static_cast' weiß - ist dynamische Polymorphie, aber Vorlagen ist statisch, wird es nicht funktionieren. –

+3

@KirillRud: Dies ist der idiomatische Weg, es sei denn, ich brauche eine sehr große Tasse Kaffee. – Bathsheba

3
auto identifier = type{value} 

Dies ist die Syntax vorgeschlagen ist durch Sutter Mill in seiner AAA (Almost Always Auto) Guru of the Week #94 wenn man sich auf einen bestimmten Typ festlegen muss.

Es gilt hier perfekt:

int iA = 1051; 

using foo_int_type = void(*)(int); 
auto non_ambiguous_int_foo = foo_int_type{foo}; 
todo(iA, non_ambiguous_int_foo); 

Live demo on coliru

+0

Gute Idee, aber es funktioniert nicht im Fall, wenn Funktion andere Typen außer void zurückgeben. –

+0

@KirillRud - Du hast schon einige Kommentare gemacht, also muss ich das nur fragen: Woher bekommst du das alles? – StoryTeller

+0

@KirillRud natürlich müssen Sie explizit den Typ der Überladung verwenden, die Sie verwenden möchten. Wenn Sie 'bool foo (int)' qualifizieren müssen, müssen Sie Ihren Typ als 'bool (*) (int)' usw. definieren. – YSC

1

Sie static_cast verwenden können, die richtige Funktion Überlastung zu wählen. Zum Beispiel: todo(iA, static_cast<void(&)(double)>(foo))

+0

Wie ich 'static_cast' weiß - ist dynamische Polymorphie, aber Vorlagen ist statisch, wird es nicht funktionieren. –

+0

@Kirill Rud 'static_cast' hat mehrere Funktionen. Die eine, die ich hier gezeigt habe, wird selten benutzt, aber sie existiert und ist absolut korrekt. Wie der Name schon andeutet, ist es der Zweck, "Dinge" statisch zu machen. Die Fälle, in denen mit polymorphen Klassen gearbeitet werden kann, sind nur dann verfügbar, wenn alle zum Ausführen einer Umwandlung erforderlichen Informationen zum Zeitpunkt der Kompilierung zur Verfügung stehen, dh es keine virtuelle Vererbung gibt. YSC hat dich auch mit einer anderen Technik (auch korrekt) beantwortet, die unter der Haube einen 'static_cast' beinhaltet. – navyblue

Verwandte Themen