LINUX.ORG.RU

[C++] функция принимающая массив константной длины параметризованная по размеру массива?

 


0

1

Мне нужно сделать пачку перегруженных ф-й от разлиынх аргументов, в т.ч. параметризованную ф-ю принимающую массив известной длины. Вариант

template < class T, int D > inline void f( T[D] )

не прокатывает. Вариант

template < int D > inline void f( int[D] )

тоже (компилер не может найти подходящю ф-ю и честно об этом говорит, хотя я не оч понимаю что ему не нравится). Вариант

inline void f( int[10] )

работает, но размер в принципе может быть любой... Ф-я с массивом ничего не делает, ей важен только тип элемента и размер. Когда то помнится мне удавалось такую штуку сваять, но секрет оказался утерян;-(((

★★★★★

Ничего лучше GCC-изма typeof не придумал:

#include <cstddef>
#include <iostream>

template<typename T>
struct last_extent;

template<typename T, std::size_t D>
struct last_extent<T[D]>
{
  static const std::size_t value = D;
};

template <class T> 
inline void f(T, int sz) 
{
  std::cout << sz << std::endl;
}

int main()
{
  int a[10];
  int b[20];

  f(a, last_extent<typeof(a)>::value);
  f(b, last_extent<typeof(b)>::value);
}
Begemoth ★★★★★
()

А вообще надо использовать boost::array/std::tr1::array/std::array.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Спасибо, но мне это надо осознать;-))))))

Вообще из скромного личного пыта - компилер очень даже различает напр int[2] и int[3], в свое время пришлось из за этого втыкать лишний параметр в шаблон и вообще сильно вывихивать мосг. Теперь вот он их различать отказывается напрочь, жрет все, даже int* ... чего я интересно не понимаю???? ;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от ringill

ДААААА! Вот эта магическая комбинация!!! Все работает, спасибо!

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.