Déduire l’argument de modèle pour la taille de la liste d’initialisation

J’ai le code suivant (non compilable):

template void foo( std::array ) { // Code, where "N" is used. } int main() { foo( { 1,2 } ); } 

Ici, je veux passer un nombre arbitraire d’ int à une fonction foo – par commodité, j’utiliserai la notation std::initializer_list . J’ai essayé d’utiliser un std::array pour agréger les int (comme indiqué dans le code ci-dessus). Cependant, le compilateur ne peut pas en déduire la taille du tableau car les int sont passés en tant que std::initializer_list .

L’utilisation d’un std::initializer_list au lieu d’un std::array ne résout pas non plus le problème puisque (contrairement à std::array ), la taille de std::initializer_list n’est pas capturée en tant qu’argument de modèle.

Est-ce que quelqu’un sait quelle structure de données peut être utilisée pour que les int puissent être passés en utilisant la notation std::initializer_list et sans passer explicitement l’argument de modèle N de foo ?

Merci d’avance

Grâce au numéro de base 1591 , vous pouvez utiliser

 template  void foo( int const (&arr)[N] ) { // Code, where "N" is used. } foo({1, 2, 3}); 

Si l’utilisation d’une liste d’initialisation n’est pas indispensable, vous pouvez utiliser des packs de parameters de modèles variadiques:

 template void foo_impl(array const&) { cout << __PRETTY_FUNCTION__ << endl; } template auto foo(Vals&&... vals) { foo_impl({ std::forward(vals)... }); } 

vous l’appelez comme suit:

 foo(1,2,3,4,5); 

Cela diffère des vérifications de type communes jusqu’au point d’initialisation de std::array (sauf si vous ajoutez des assertions certes moches), vous devriez donc probablement préférer la réponse de Columbo.