Puis-je surcharger ma fonction pour faire quelque chose avec beaucoup d’arguments comme en JavaScript . Par exemple:
function f() { alert(arguments[0]); } f(4); // will alert 4
Puis-je faire la même chose en C ++ ?
Vous pouvez utiliser des arguments et des tuples de modèles variadiques:
#include #include template void f(Args&&... args) { auto arguments = std::make_tuple(std::forward(args)...); std::cout << std::get<0>(arguments); } void f() {} // for 0 arguments int main() { f(2, 4, 6, 8); }
Démo en direct
Pour vérifier les limites, essayez ce qui suit:
#include #include template struct input { std::tuple var; input(T&&... t) : var(std::forward(t)...) {} template ::value> auto get() -> typename std::tuple_element>::type { return std::get (var); } }; template void f(Args&&... args) { auto arguments = input(std::forward(args)...); std::cout << arguments.template get<9>(); } void f() {} // for 0 arguments int main() { f(2, 4, 6, 8); }
Mise à jour: Si vous avez besoin du premier argument, vous voulez simplement une fonction qui expose ce premier argument en le séparant du pack de parameters:
template void foo(Head&& head, Tail&&... tail);
Si ce n’est pas satisfaisant (c’est-à-dire que vous voulez obtenir le nième argument), vous pouvez décompresser les arguments dans un std::tuple<>
et récupérer un élément avec std::get<>
:
template void foo(Args&&... args) { auto t = std::forward_as_tuple(std::forward(args)...); print(std::get<5>(t)); }