2013-02-21 6 views
5

ich ein Funktionsobjekt mit einem expliziten (dh nicht-abgeleitet) Template-Parametern wie folgt definiert:C++ Funktionsobjekte mit explizitem Template-Parameter

struct foo 
{ 
    template<class T> 
    T operator()() const 
    { 
     return 5; 
    } 
}; 

foo bar = {}; 

Wenn ich versuche, es so zu nennen:

int main() 
{ 
    int i = bar<int>(); 
    return 0; 
} 

Ich bekomme einen Kompilierfehler. Gibt es keine Möglichkeit, das Funktionsobjekt mit einem Template-Parameter wie eine reguläre Funktion aufzurufen? Ich muss es wirklich als Funktionsobjekt haben. Eine freie Funktion zu machen, ist für mich nicht wirklich eine Option (oder zumindest eine sehr chaotische Option).

+2

möglich Duplikat [? Wie rufe ich einen templatized Operator()()] (http://stackoverflow.com/questions/11105060/how -do-i-call-a-templatized-operator) – ildjarn

Antwort

9

Leider kann man es nicht so nennen. Sie müssen die operator() Syntax:

struct foo 
{ 
    struct inner { 
    template <typename T> operator T() const { return 5; } 
    }; 
    inner operator()() const { return inner(); } 
}; 

foo bar = {}; 
int main() 
{ 
    int i = bar(); // implicit 
    auto x = static_cast<int>(bar()); // "explicit" template parameter 
} 

Ich denke, eine Syntax genau wie bar<int>() unmöglich ist:

int i = bar.operator()<int>(); 
2

Sie einen Trick, mit dem Konvertierungsoperator wie folgt verwenden könnte.

+0

Das würde nur funktionieren, der Template-Parameter wurde im Rückgabetyp verwendet, wie in meinem Beispiel, aber ich muss sie mit Funktionsobjekten verwenden, die das nicht verwenden Vorlagenparameter im Rückgabetyp. –

0

Vielleicht können Sie Ihre Lösung, da dies vereinfachen:

template<class T> 
struct foo 
{ 
     T operator()() const 
     { 
      return 5; 
     } 
}; 

foo<int> bar = {}; 

int main() 
{ 
    int i = bar(); 
    return 0; 
} 
+0

Jetzt ist es möglich, "int i = bar;" zu schreiben, was Sie wahrscheinlich nicht wollen. – ipc