21 Kasım 2016 Pazartesi

Variadic Template C++14

for döngüsü kullanımı
Şöyle yaparız.
for (const auto& array : { args... })
Örnek 1
Sayıların çarpımını almak için şöyle yaparız.
// outside the class
template<size_t... Ns>
constexpr size_t product(){
  size_t p = 1;
  for(auto n : { Ns... }) p *= n;
  return p;
}

// then
std::array< float, product<N_i...>()> arr;
Örnek 2
std::array<..> kabul eden ve her indeksin ortalamasını alan bir metodum yazmak istersek şöyle yaparız
template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average (const Ts&... args)
{
  std::array<T, N> result;
  for (std::size_t i = 0; i < N; ++i)
  {
    T addedValues = 0;
    for (const auto& array : { args... })
      addedValues += array[i];

      result[i] = addedValues / sizeof...(args);
  }

  return result;
}
metod çağırma kullanımı
Açıklaması şöyle
I wrote a template that takes an istream& and a function and is supposed to extract all parameters for this function from the istream, call the function with these parameters and return the result.
Şöyle yaparız. Burada function Foo constructor ve parametre olarak int ve string alıyor. Dolayısıyla Parse metodu int ve string ile çağrılacak. Buradaki tek problem function çağrısında "order of evaluation" soldan sağa olmak zorunda değil. Derleyicisine göre değişebilir. Soldan sağa olmasını sağlamanın yöntemi yine linkte var.
#include <iostream>
#include <vector>

void Foo(int i, std::string s)
{
  std::cout << "input was " << i << " and " << s << '\n';
}

template<typename T>
T Parse(std::istream &s)
{
  T res;
    
  s >> res;
    
  return res;
}

template<typename TR, typename ... TArgs>
TR Bar(std::istream &s, TR f(TArgs...) )
{
  return f(Parse<TArgs>(s)...);
}

int main()
{
  Bar(std::cin, Foo);
}
Bu uygulamayı "1 2" girdisiyle çağırırız. Çıktı olarak şunu alırız
input was 2 and 1
sizeof kullanımı
Şöyle yaparız.
template<int N, typename... Ts>
constexpr bool number_of_args_divisible_by(Ts&&...)
{
  return sizeof...(Ts) % N == 0;
}

Hiç yorum yok:

Yorum Gönder