C ++中未定义的参数数量

时间:2013-05-02 11:55:38

标签: c++ overloading variadic-functions

我可以使用 JavaScript 重载我的函数以执行许多参数。 例如:

function f()
{
  alert(arguments[0]);
}

f(4); // will alert 4 

我可以在 C ++ 中做同样的事情吗?

1 个答案:

答案 0 :(得分:6)

您可以使用可变参数模板参数和元组:

#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);
}

Live Demo

对于边界检查,请尝试以下操作:

#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个参数),你可以将参数解压缩到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));
}