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.