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ı
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 sizeof kullanımı
Şöyle
yaparız.
template<int N, typename... Ts>
constexpr bool number_of_args_divisible_by(Ts&&...)
{
return sizeof...(Ts) % N == 0;
}