2013-02-21 12 views
5

Ho un oggetto funzione con un esplicito (cioè non dedotto) parametro di template definiti in questo modo:funzione C++ gli oggetti con parametri di modello espliciti

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

foo bar = {}; 

quando provo a chiamare in questo modo:

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

Viene visualizzato un errore di compilazione. Non c'è modo di chiamare l'oggetto funzione con un parametro template come una funzione regolare? Ho davvero bisogno di averlo come oggetto funzione. Fare una funzione gratuita non è un'opzione per me (o almeno, è un'opzione molto complicata).

+2

possibile duplicato di [? Come chiamare un operatore di templatized()()] (http://stackoverflow.com/questions/11105060/how -do-i-call-a-templatized-operator) – ildjarn

risposta

9

Sfortunatamente, non si può chiamare così. È necessario utilizzare il operator() sintassi:

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

Si potrebbe usare un trucco con l'operatore di conversione in questo modo:

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 
} 

penso che una sintassi esattamente come bar<int>() è impossibile.

+0

Funzionerebbe solo il parametro template è stato usato nel tipo restituito, come nel mio esempio, ma ho bisogno di usarli con oggetti funzione che non usano il parametro template nel tipo restituito. –

0

Forse è possibile semplificare la vostra soluzione come questa:

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

foo<int> bar = {}; 

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

Ora è possibile scrivere 'int i = bar;' che probabilmente non si desidera. – ipc

Problemi correlati