carlosmay Temat założony przez niniejszego użytkownika |
[C++] Szablon funkcji i specjalizacja » 2015-07-22 10:05:55 template < typename T > T maxn( const T tab[], const short & n );
ten szablon zwraca max wartość znalezioną w tablicy i działa, ale druga część tej zagadki, jak napisać specjalizację żeby zwróciła adres najdłuższego znalezionego łańcucha z kilku elementowej tablicy typu char. np. tablica char c[ 5 ][ 11 ] = { "mama", "aleksandra", "koles", "jazgot:", "marzenia" };
wymyśliłem taką głupotę template <> char & maxn < char >( const char tab[], const short & n );
to na pewno jest żle. Jak poprawnie zadeklarować tą specjalizację? |
|
Monika90 |
» 2015-07-22 10:41:31 Jak poprawnie zadeklarować tą specjalizację? |
Nie da się, zamiast specjalizacji użyj przeciążenia. Dlaczego ta funkcja przyjmuje argument typu short, na dodatek przez referencję? To dość dziwne. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-07-22 10:57:22 OK. Prata wymyślił takie zadanie. short to rozmiar tablicy, mały bo 5 więc i short, a referencja żeby nie kopiować wartości.
@up: Zapakuję tę tablicę do struktury i pokombinuję z ten sposób, ew. pokombinuję z użyciem jawnego tworzenia egzemplarza. Jak nie da rady to trudno. |
|
pekfos |
» 2015-07-22 12:22:31 short to rozmiar tablicy, mały bo 5 więc i short, a referencja żeby nie kopiować wartości. |
To (podwójnie) złe myślenie. Niekopiowanie jest w tym przypadku gorsze od kopiowania, a zmniejszenie rozmiaru zmiennej nie ma sensu. Nie oszczędzasz w ten sposób pamięci, a tylko zmniejszasz swoje możliwości. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-07-22 12:40:32 Czyli używać (naturalnego) int i przekazywać przez wartość.
|
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-07-22 22:21:28 Nic ciekawszego nie wymyśliłem. Specjalizacja zwraca najdłuższy łańcuch char. #include <iostream> using std::cout; using std::endl;
template < typename T > T maxn( const T tab[], int n );
struct C { char ch[ 11 ]; }; template <> C maxn < C >( const C tab[], int n );
int main() { const short size_int = 5; int t1[ size_int ] = { 2, 5, 8, 3, 1 }; cout << "Najwyzszy z intow to " << maxn( t1, size_int ) << endl; const short size_double = 4; double t2[ size_double ] = { 12.4, 4.65, 22.65, 18.36 }; cout << "Najwyzszy z doublow to " << maxn( t2, size_double ) << endl; const int size_char = 5; C c[ size_char ] = { "mama", "aleksandra", "koles", "jazgot:", "marzenia" }; C temp = maxn( c, size_char ); cout << "Najdluzszy lancuch to \"" << temp.ch << "\" majacy " << strlen( temp.ch ) << " znakow." << endl; system( "pause" ); }
template < typename T > T maxn( const T tab[], int n ) { T temp = 0; for( int i = 0; i < n; ++i ) if( tab[ i ] > temp ) temp = tab[ i ]; return temp; }
template <> C maxn < C >( const C tab[], int n ) { C temp = tab[ 0 ]; int max = 0; for( int i = 1; i < n; ++i ) { if( strlen( tab[ i ].ch ) > strlen( temp.ch ) ) { max = i; temp = tab[ i ]; } } return tab[ max ]; }
@up: Jeśli uznacie to za bezsensowne przenieście do bezużytecznych, żeby inni nie powielali takich pomysłów. |
|
Adik80 |
» 2015-07-23 15:21:30 Czemu niby nie da rady wyspecjalizowac? template <> const char * maxn < const char *>( const char * const tab[], const short & n ) {...} |
|
pekfos |
» 2015-07-23 15:43:26 Czemu niby nie da rady wyspecjalizowac? |
To nie zadziała dla char c[5][11]. |
|
« 1 » 2 |