我可以重载我的函数来做一些有很多参数的事情,就像在JavaScript中一样。例如:
function f()
{
alert(arguments[0]);
}
f(4); // will alert 4
我可以在C++中做同样的事情吗?
我可以重载我的函数来做一些有很多参数的事情,就像在JavaScript中一样。例如:
function f()
{
alert(arguments[0]);
}
f(4); // will alert 4
我可以在C++中做同样的事情吗?
您可以使用可变模板参数和元组:
#include <tuple>
#include <iostream>
template <class... Args>
void f(Args&&... args)
{
auto arguments = std::make_tuple(std::forward<Args>(args)...);
std::cout << std::get<0>(arguments);
}
void f() {} // for 0 arguments
int main()
{
f(2, 4, 6, 8);
}
对于边界检查,请尝试以下操作:
#include <tuple>
#include <iostream>
template <class... T>
struct input
{
std::tuple<T...> var;
input(T&&... t) : var(std::forward<T>(t)...) {}
template <std::size_t N, bool in_range = 0 <= N && N < std::tuple_size<decltype(var)>::value>
auto get() -> typename std::tuple_element<in_range ? N : 0, std::tuple<T...>>::type
{
return std::get<in_range ? N : 0>(var);
}
};
template <class... Args>
void f(Args&&... args)
{
auto arguments = input<Args...>(std::forward<Args>(args)...);
std::cout << arguments.template get<9>();
}
void f() {} // for 0 arguments
int main()
{
f(2, 4, 6, 8);
}
更新:如果您需要第一个参数,那么您只需要一个通过将第一个参数与参数包分开来公开第一个参数的函数:
template<class Head, class... Tail>
void foo(Head&& head, Tail&&... tail);
如果这不令人满意(即您想要获得第 n 个参数),您可以将参数解压缩到 a 中std::tuple<>
并使用 检索元素std::get<>
:
template<class... Args>
void foo(Args&&... args)
{
auto t = std::forward_as_tuple(std::forward<Args>(args)...);
print(std::get<5>(t));
}