2015-12-16 17 views
8

Rozważmy tę szczególną klasę kontenera, który przechowuje typy, które zawierają zarówno klucza i wartości wewnątrz niego, takSzablon z domyślnej wartości argumentu metody wskaźnika

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

K to rodzaj klucza, T jest typem wartości a wskaźnik metody służy do odzyskania klucza z wartości.

To działa dobrze, ale chciałbym zawierać domyślne wskaźnika metody tak, że gdy nie został określony przez rozmówcę byłoby operator K() const tak:

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

ale to nie skompilować podając tam to jest no member operator const K on A (<- my class I test this with), kiedy próbuję utworzyć instancję (i istnieje taka metoda). Czy jest nawet możliwa wartość domyślna argumentu szablonu wskaźnika metody? Jeśli tak, jaka jest prawidłowa składnia?

EDIT: W uzupełnieniu do roztworu poniżej znajduje się „naprawić” w przypadkach, gdy T jest wskaźnikiem, który wykorzystuje nową funkcję C++ 11 std::remove_pointer<T>::type, więc:

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

Pomysł jest [dźwięk w zasadzie] (http://ideone.com/fgtF5y). Może to być po prostu poprawne wpisanie nazwy konkretnej funkcji (funkcji konwersji). –

+2

[Tam] (http://ideone.com/k1bCEJ), może usunąć 'const'? –

+1

'operator K const' (==' operator const K') byłby funkcją konwersji do, no, 'const K'. –

Odpowiedz

5

Nazwa funkcji to tylko operator K. Jego kwalifikacja nie jest częścią nazwy. Wypróbuj:

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

Dobra rada: nazwisko członka * nie * obejmuje kwalifikatory (lub argumenty). Jeśli konieczne jest rozwiązanie problemu przeciążenia, należy to zrobić poprzez konwersję do odpowiedniego wskaźnika elementu (który jest, w dogodny sposób, dostępny w tym przypadku). –

+0

Oczywiście, oczywiście. Teraz działa, z wyjątkiem sytuacji, gdy używam wskaźnika do T jako argumentu. Myślę, że specjalizacja powinna w tym pomóc. – Resurrection

+0

I wymyśliłem to dla przypadków, gdy T jest również wskaźnikiem. Dodano jako edycję do OP. – Resurrection

Powiązane problemy