2016-04-29 9 views
2

Ich versuche, einen überladenen Funktionszeiger übergeben, wie unten im Beispielcode gezeigt.C++ überladen Funktion Zeiger Ambiguität

class Sample 
{ 
    uint32_t method(char* input1, double input2); 
    uint32_t method(double input1); 
} 

template<class T, class... Args) 
void processInput(T &&t, Args&&... a) 
{ 
    std::packaged_task<uint32_t(Args...)> task(std::bind(t, a...)); 
    // other processing 
} 

// Caller invokes the below API 
Sample* obj = new Sample(); 
processInput(static_cast<uint32_t(*)(double)>(&Sample::method), &*obj, 2.0f); 

Dieser Code wird jedoch nicht kompiliert. Es beschwert sich, dass es nicht feststellen kann, welche Instanz der überladenen Funktion beabsichtigt ist. Ich verweisen einige Beispiele:

C++ overloaded method pointer

http://en.cppreference.com/w/cpp/language/static_cast

Kann jemand Hilfe bei dem Hinweis auf, was hier schief geht?

+3

Shoudln't 'static_cast ' 'sein static_cast ' da es eine Member-Funktion? – NathanOliver

+1

@pree Korrigieren Sie Ihre Tippfehler (fehlende ';', ')' anstelle von '>'). Die Funktion gibt auch nicht "double" zurück. – LogicStuff

+0

Das war es! Ich habe die Implementierung von static_cast beim Überladen von Funktionen nicht wirklich verstanden und machte es falsch! Danke @NathanOliver & LogicStuff. – pree

Antwort

4

Sobald Sie die Tippfehler beheben, ist das Hauptproblem, dass Sie versuchen, einen Mitgliedsfunktionszeiger auf einen Funktionszeiger zu übertragen.

Das heißt, ist die folgende illegal:

static_cast<uint32_t(*)(double)>(&Sample::method) 
error: invalid static_cast from type 
‘uint32_t (Sample::*)(double) {aka unsigned int (Sample::*)(double)}’ 
to type 
‘uint32_t (*)(double) {aka unsigned int (*)(double)}’ 

Die Syntax für ein Mitglied Funktionszeiger ist

ReturnT(ClassT::*)(ArgTs); 

So würde Ihre Besetzung sein müssen:

static_cast<uint32_t(Sample::*)(double)>(&Sample::method) 

Beispiel:

#include <iostream> 
#include <functional> 

struct Sample 
{ 
    uint32_t method(char* input1, double input2) { return 0; } 
    uint32_t method(double input1) { return 0; } 
}; 

template<class T, class... Args> 
void processInput(T &&t, Args&&... a) 
{ 
    auto task = std::bind(t, a...); 
    (void)task; 
} 

int main() 
{ 
    Sample* obj = new Sample(); 
    processInput(static_cast<uint32_t(Sample::*)(double)>(&Sample::method), obj, 2.0f); 

    return 0; 
}