Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Szablon funkcji i specjalizacja

Ostatnio zmodyfikowano 2015-07-23 16:47
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[C++] Szablon funkcji i specjalizacja
» 2015-07-22 10:05:55
C/C++
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
C/C++
char c[ 5 ][ 11 ] = {
    "mama",
    "aleksandra",
    "koles",
    "jazgot:",
    "marzenia"
};
wymyśliłem taką głupotę
C/C++
template <> char & maxn < char >( const char tab[], const short & n );
to na pewno jest żle. Jak poprawnie zadeklarować tą specjalizację?
P-135070
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.
P-135072
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.
P-135074
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.
P-135082
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-07-22 12:40:32
Czyli używać (naturalnego) int i przekazywać przez wartość.
P-135083
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.

C/C++
#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()
{
    // wywołanie szablonu dla tablicy intów
    const short size_int = 5;
    int t1[ size_int ] = { 2, 5, 8, 3, 1 };
    cout << "Najwyzszy z intow to " << maxn( t1, size_int ) << endl;
   
    // wywołanie szablony dla tablicy doublów
    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;
    // specjalizacja dla
    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.
P-135099
Adik80
» 2015-07-23 15:21:30
Czemu niby nie da rady wyspecjalizowac?
C/C++
template <>
const char * maxn < const char *>( const char * const tab[], const short & n )
{...}
P-135111
pekfos
» 2015-07-23 15:43:26
Czemu niby nie da rady wyspecjalizowac?
To nie zadziała dla char c[5][11].
P-135113
« 1 » 2
  Strona 1 z 2 Następna strona