Problem i jak go rozwiązać w C ++
Problem został szczegółowo wyjaśniony przez Pat i Matta . Kompilator zasadniczo ignoruje pierwszy wymiar rozmiaru tablicy, skutecznie ignorując rozmiar przekazanego argumentu.
Z drugiej strony w C ++ można łatwo pokonać to ograniczenie na dwa sposoby:
- za pomocą odniesień
- using
std::array(od C ++ 11)
Bibliografia
Jeśli twoja funkcja próbuje tylko odczytać lub zmodyfikować istniejącą tablicę (nie kopiować jej), możesz łatwo użyć referencji.
Na przykład załóżmy, że chcesz mieć funkcję, która resetuje tablicę dziesięciu ints, ustawiając każdy element na 0. Możesz to łatwo zrobić, używając następującego podpisu funkcji:
void reset(int (&array)[10]) { ... }
Nie tylko będzie to działać dobrze , ale także wymusi wymiar tablicy .
Możesz także skorzystać z szablonów, aby powyższy kod był ogólny :
template<class Type, std::size_t N>
void reset(Type (&array)[N])
I wreszcie możesz skorzystać z constpoprawności. Rozważmy funkcję, która wyświetla tablicę 10 elementów:
void show(const int (&array)[10]) { ... }
Stosując constkwalifikator zapobiegamy ewentualnym modyfikacjom .
Standardowa klasa biblioteczna dla tablic
Jeśli uznasz powyższą składnię za brzydką i niepotrzebną, tak jak ja, możemy wrzucić ją do puszki i użyć std::arrayzamiast niej (od C ++ 11).
Oto refaktoryzowany kod:
void reset(std::array<int, 10>& array) { ... }
void show(std::array<int, 10> const& array) { ... }
Czy to nie wspaniałe? Nie wspominając o tym, że ogólna sztuczka z kodem, której nauczyłem Cię wcześniej, nadal działa:
template<class Type, std::size_t N>
void reset(std::array<Type, N>& array)
template<class Type, std::size_t N>
void show(const std::array<Type, N>& array)
Nie tylko to, ale otrzymujesz za darmo kopiowanie i przenoszenie semantyczne. :)
void copy(std::array<Type, N> array) {
}
Więc na co czekasz? Idź, użyj std::array.