2 Ocak 2018 Salı

Template argument deduction

Giriş
Template Argument Deduction explicit veya implicit olabilir.

explicit şöyle olur.
template<typename T>
void do_something(T value) {};

do_something<float>(6);  // T is float
implicit şöyle olur.
int x;

do_something(x);  // since first argument is T and x is int, T is int
Bir başka implicit örnek şöyle
template <typename T1,typename T2> void add(T2 a);
add<sample>(3);  // T1 is explcitly sample, T2 is implicitly int

STL ile Template Argument Deduction
template argument deduction STL ile bir çok algoritmada karşımıza çıkıyor. Genelde verilen dizinin büyüklüğünü derleyicinin bulması için kullanılıyor.

Bazı implicit örnekler şöyle.

std::end
std::end şöyle tanımlı. N boyutlu T tipini içeren bir array'i referans olarak alır.
template< class T, std::size_t N >
T* end( T (&array)[N] );
Metodun içi de muhtemelen şöyle
template< class T, std::size_t N >
T* end( T (&array)[N] )
{
    return array + N ;
}
Dolayısıyla şöyle kullanılabiliyor.
int arr[] = {1, 2, 3};
size = end(arr) - begin(arr);

Kendi Kodumuz İçin Implicit Diğer Örnekler
Örnek
Template kodlarda şöyle yaparız.
template <std::size_t sz)
void foo(double (&x)[sz]) {
   std::copy_n(x, sz, arr);
}
Örnek
recv diye bir metodumuz olsun
int recv(char* buf, int len) {
  int tmp = pos;
  while (len-- && pos < 26)
    *buf++ = arr[pos++];

  return pos - tmp;
}

template <size_t N>
int recv2(char(&array)[N]) {
  return recv(array, N);
}
Bu metodu şöyle çağırabiliriz.
char buffer[10];
recv2(buffer)


Hiç yorum yok:

Yorum Gönder