2015-12-16 19 views
8

considerare questa classe contenitore speciale che memorizza tipi che contengono sia chiave e il valore al suo interno, cosìModello con valore predefinito dell'argomento metodo puntatore

template<typename K, typename T, K (T::*method)() const> 
class Container 
{ 
//... 
}; 

K è il tipo di una chiave, T è un tipo di valore e il puntatore del metodo viene utilizzato per recuperare la chiave dal valore.

Funziona benissimo, ma vorrei includere un valore predefinito per il puntatore metodo in modo che, quando non è stato specificato dal chiamante sarebbe operator K() const in questo modo:

template<typename K, typename T, K (T::*method)() const = &T::operator K const> 

ma questo non può essere compilato indicando lì è no member operator const K on A (<- my class I test this with) quando provo a istanziarlo (e c'è un tale metodo). È persino possibile avere il valore predefinito di un argomento del modello del puntatore del metodo? Se sì, qual è la sintassi corretta?

EDIT: Oltre alla soluzione sotto c'è un "fissare" per i casi in cui T è un puntatore che utilizza la nuova C++ 11 caratteristica std::remove_pointer<T>::type, quindi:

template<typename K, typename T, K (std::remove_pointer<T>::type::*method)() const = &std::remove_pointer<T>::type::operator K> 
+1

L'idea è [suono in linea di principio] (http://ideone.com/fgtF5y). Potrebbe essere solo una questione di ortografia del nome della particolare funzione (la funzione di conversione) correttamente. –

+2

[There] (http://ideone.com/k1bCEJ), forse rimuovere 'const'? –

+1

'operatore K const' (==' operatore const K') sarebbe una funzione di conversione in, beh, 'const K'. –

risposta

5

Il nome della funzione è solo operator K. La sua qualifica non fa parte del nome. Prova:

template <typename K, 
      typename T, 
      K (T::*method)() const = &T::operator K> 
//         ^^^^^^^^^^^^^^ 
+2

Buon punto: il nome del membro * non * riguarda i qualificatori (o gli argomenti). Se è necessario risolvere un sovraccarico, questo deve essere fatto tramite la conversione in un puntatore membro appropriato (che è, convenientemente, facilmente disponibile in questo caso). –

+0

Giusto, certo. Ora funziona tranne quando uso il puntatore su T come argomento. Suppongo che la specializzazione dovrebbe aiutare in questo però. – Resurrection

+0

E ho capito per i casi in cui anche T è un puntatore. Aggiunto come modifica all'OP. – Resurrection

Problemi correlati