Variadic模板,获取函数参数值

时间:2014-02-04 23:16:58

标签: c++ c++11 variadic-templates variadic-functions

我的问题如下: 我有一个声明的类:

template<typename ReturnType, typename... Args>
class API
{
    ReturnType operator()(Args... args)
    {
       // Get argument 0
       // Get argument 1
    }
};

我需要通过一个人来获取论点,到目前为止我唯一的方法(但我无法让它工作)正在使用std::get,因此:

std::get<0>(args);

当然,这会导致很多错误。 我是variadic模板的新手(根本不是C ++ 11),所以我现在很失落。

我怎么能逐一得到这些论点? 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:6)

在临时元组(Live at Coliru)中捕获args:

ReturnType operator()(Args... args)
{
   static_assert(sizeof...(args) >= 3, "Uh-oh, too few args.");
   // Capture args in a tuple
   auto&& t = std::forward_as_tuple(args...);
   // Get argument 0
   std::cout << std::get<0>(t) << '\n';
   // Get argument 1
   std::cout << std::get<1>(t) << '\n';
   // Get argument 2
   std::cout << std::get<2>(t) << '\n';
}

std::forward_as_tuple使用完美转发来捕获对args的引用,因此不应该复制。

答案 1 :(得分:2)

您可以使用递归。

以下是一个例子:

#include <iostream>

template<typename ReturnType>
class API {
public:
    template<typename Arg>
    ReturnType operator()(Arg&& arg) {
        // do something with arg
        return (ReturnType) arg;
    }

    template<typename Head, typename... Tail>
     ReturnType operator()(Head&& head, Tail&&... tail) {
        // do something with return values
        auto temp = operator()(std::forward<Head>(head));
        return temp + operator()(std::forward<Tail>(tail)...);
    }
};

int main() {
    API<int> api;
    auto foo = api(1, 2l, 2.0f);
    std::cout << foo;
    return 0;
}