2015-04-02 13 views
6

Próbuję przekazać przez odniesienie tablicę nieznanej liczby wymiarów (pozycja). Zasadniczo chciałbym zrobić coś podobnego (który nie kompiluje)Przekaż tablicę nieznanej pozycji przez odniesienie

template <typename T, int... dims> 
void f(T (&arr)[dims]...) // not working 
{ 
    // would like to modify the elements of `arr` here, according to some rule 
} 

int main() 
{ 
    int arr[2][3][4]; // rank 3 
    f(arr); 
} 

Czy jest jakiś sposób osiągnięcia tego? W szczególności, czy w jakiś sposób można zastosować podejście variadic-template?

Mogę zrobić rodzajowy template<typename T> f(T& arr), ale w takim przypadku w jaki sposób mogę odzyskać rozmiary bez jawnego ich przekazywania? (Nawet przy podejściu do szablonu variadic nie jestem pewien, jak odzyskać poszczególne elementy w pakiecie ... bez pewnego rodzaju rekurencyjnego składania).

W szczególności szukam prostego sposobu inicjowania tablicy o nieznanej randze zgodnie z pewną regułą.

Odpowiedz

3

Wystarczy przekazać odwołanie do tablicy typu T. Wtedy T może być inną tablicą i tak dalej. Nie ma potrzeby stosowania złożonej składni. Więc twój kod będzie wyglądać następująco:

template <typename T, int sz> 
void f(T (&arr)[sz]) // working 
{ 
    std::rank<T[sz]>::value; //evaluates to array rank 
} 

int main() 
{ 
    int arr[2][3][4]; // rank 3 
    f(arr); 
} 

Można wówczas uzyskać rangę tablicy za pomocą std::rank.

Można również uzyskać rozmiary podbloków za pomocą std::remove_extent i rekursji szablonów.

Życie example.

+0

Dzięki, ale myślę, że dostaniesz rangę z 'std :: rank :: value', prawda? Problem polega na tym, że 'std :: cout << std :: rank :: value << std :: endl;' wypluwa '0'. – vsoftco

+0

Tak - masz rację - przepraszam. Musisz użyć "decltype". – AnArrayOfFunctions

+0

i "wartość", a nie "wartość_typu". Ale nawet w tym przypadku wydaje się, że 'std :: rank' uważa, że ​​przekazywany jest rodzaj ogólny typu nieszablonowego. Próbując 'std :: cout << typeid (arr) .name();' podaje poprawny typ, tablicę 3-D, ale z jakiegoś powodu 'std :: rank' nie działa. Spróbuj wyświetlić rangę. – vsoftco

Powiązane problemy