Listy parametrów o zmiennej długości

0

W książce "C++ zaawansowane programowanie" przeczytałem o listach parametrów zmiennej długości i zaraz po tym napisałem w swoim programie funkcje która korzysta z tego mechanizmu dla klasy statusbar-a w celu ustawienia ilości części i tekstu w nich wyświetlanych

void c_statusbar::set( const unsigned int n, ... )
{
    char * temp_argument_ptr;
    char search_arguments[n][255];
    va_list ap;

    va_start( ap, n );
    for (unsigned int i=0; i<n; ++i) {
        temp_argument_ptr = va_arg( ap, char * );
        strcpy ( search_arguments[i], temp_argument_ptr );
        temp_argument_ptr = 0;
    }

    va_end( ap );
    // dalsza czesc funcji....
}

w książce przedstawiono to raczej jako ciekawostkę i odradzano korzystania ale przyznam szczerze że ta opcja bardzo mi się spodobała dlatego mam pytanie czy można wyeliminować ewentualne ryzyko korzystania z tego elementu c++?

0

Dużo prościej i bezpieczniej będzie użyć kontenera, w którym po prostu będą znajdować się te napisy.

Być może variadic templates z C++11 mogą się jakoś nadać, ale to droga pod górę.

1

Ja bym proponował użycie std::initializer_list.

0

Dzięki Satirev ;) chodziło mi właśnie o możliwość przekazywania dowolnej liczby argumentów do funkcji a ta opcja nie dość że właśnie to mi umożliwia to dodatkowo jest czytelniejsza i pewnie dużo bezpieczniejsza ;) Dziękuje wszystkim za pomoc ;)

0
satirev napisał(a):

Ja bym proponował użycie std::initializer_list.

A ja nie do tak końca. std::initializer_list nadaje się najlepiej do użytku podczas kompilacji, kiedy znamy elementy i ich ilość. Do takiej listy nie da się niczego dodać kiedy się ją stworzy. Nie będzie można jej konstruować dynamicznie, tak, jak można by to zrobić z std::vector.

Oczywiście to tylko taka uwaga ogólna, to wszystko zależy czego konkretnie oczekuje OP. ;-)

0

tak tylko że raz będę chciał użyć danej funkcji z 2 argumentami innym z 5 a jeszcze innym z 9. Zależy mi na tym żebym konkretne wartości, ich liczbę i typ mógł podawać dopiero podczas wywołania

void c_statusbar::set( const std::initializer_list < int > & arguments )

//wywolanie
main_statusbar.set( { 3, 5, 11 } );

wygląda dość dobrze ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1