27 votes

Est-il possible de développer des arguments non variadiques dans une fonction de modèle variadique?

Il est probablement plus facile d'expliquer ce que je veux dire par un exemple. Imagine un modèle suivant:

template <class... Args>
std::tuple<Args...> foo();

Elle peut être invoquée, par exemple, comme ceci:

auto ret = foo<int, bool>();

Mais que faire si je veux passer des arguments supplémentaires à la fonction, sur la base du nombre de variadic template arguments? Par exemple, disons que je veux passer un littéral de chaîne de caractères pour chaque Args:

auto ret = foo<int, bool>("a", "b");

Le problème avec cela, c'est qu'il ne semble pas possible d'étendre la non-variadic arguments, donc ce qui suit n'est évidemment pas à compiler:

template <class... Args>
std::tuple<Args...> foo(const char*... names);

Est-il de toute façon sensée pour mettre en œuvre cette?

45voto

Dan M. Points 2365

Vous pouvez le faire avec quelque chose comme

 template <class... Args>
std::tuple<Args...> foo(proxy<Args, const char*>... names);
 

proxy est

 template<class T, class E>
using proxy = E;
 

Vous pouvez le voir en action ici: https://godbolt.org/g/SHBYzy

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X