J'ai appris sur variadic templates, et avec l'aide de cet excellent blog, j'ai réussi à écrire un modèle de fonction even_number_of_args
qui retourne si le nombre d'arguments qu'il reçoit est divisible par 2.
#include <iostream>
bool even_number_of_args() {
return true;
}
template <typename T>
bool even_number_of_args(T _) {
return false;
}
template<typename T, typename U, typename... Vs>
bool even_number_of_args(T _, U __, Vs... vs) {
return even_number_of_args(vs...);
}
int main() {
std::cout << even_number_of_args() << std::endl; // true
std::cout << even_number_of_args(1) << std::endl; // false
std::cout << even_number_of_args(1, "two") << std::endl; // true
std::cout << even_number_of_args(1, "two", 3.0) << std::endl; // false
std::cout << even_number_of_args(1, "two", 3.0, '4') << std::endl; // true
}
Je me demandais si il était possible d'écrire un modèle de fonction qui prend, comme un argument de modèle, un certain nombre N
et retourne si le nombre d'arguments qu'il reçoit est un multiple de N
. Par exemple, la fonction peut ressembler à quelque chose comme ceci:
number_of_args_divisible_by_N<1>(1, "two", 3.0, '4'); // true
number_of_args_divisible_by_N<2>(1, "two", 3.0, '4'); // true
number_of_args_divisible_by_N<3>(1, "two", 3.0, '4'); // false
number_of_args_divisible_by_N<4>(1, "two", 3.0, '4'); // true