我的问题如下: 我有一个声明的类:
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),所以我现在很失落。
我怎么能逐一得到这些论点? 任何帮助将不胜感激。
答案 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;
}