2014-07-10 15 views
8

Podstawowe pytanie tutaj, z (miejmy nadzieję) prostą odpowiedzią: Próbuję napisać funkcję, której pierwszym argumentem jest std :: array, ale z arbitralnym rozmiar.Definiowanie funkcji, która pobiera std :: array jako parametr

void f(array<int> x) { 
    //do stuff 
} 

nie jest ważny, ponieważ potrzebuję rozmiaru dla array<int, #>. Czy istnieje sposób na obejście tego?

+0

Proszę zwrócić szczególną uwagę na tej części http://stackoverflow.com/a/ 4810672/2296458 – CoryKramer

+4

@Cyber ​​nie, to nie jest duplikat ... Czy nawet przeczytałeś powiązane pytanie i odpowiedź? Połączone pytanie dotyczy tablic w stylu C. – Theolodis

+0

Czy znasz rozmiar tablicy w czasie kompilacji? – Scis

Odpowiedz

12

Jedynym sposobem jest, aby f szablonu funkcję:

template <size_t N> 
void f(array<int, N> x) { 
    //do stuff 
} 
12

Quentins answer jest poprawna, jeśli nie muszą być elastyczne w czasie wykonywania.

Jednak, jeśli potrzebujesz być elastyczny w czasie wykonywania, polecam zamiast tego użyć std::vector.

void f(vector<int> x) { 
    //do stuff 
} 

Ponadto, warto użyć odwołania lub const odniesienie do uniknięcia kopiowania tablicy lub wektora, przynajmniej jeśli nie potrzebujemy kopii.

5

Drugi sposób wokół niego, jest za pomocą szablonu funkcji (@Quentin) i przekazać non funkcji szablonu:

#include <array> 

void g(int* first, int* last) { 
    //do stuff 
} 

template <size_t N> 
inline void f(std::array<int, N> x) { 
    g(x.begin(), x.end()); 
} 
+1

A jaka jest konkretna korzyść z funkcji non-template? – Theolodis

+2

@ Theolodis: Implementacja może znajdować się w pliku źródłowym. –

+1

@ Theolodis _ i jaka jest konkretna korzyść ...? '_ Funkcja bez szablonu jest nieco bardziej ogólna i nie zależy już od czasu kompilacji podanego 'size_t N'. –

Powiązane problemy