#include <vector> #include <iostream> #include <tuple> #include <type_traits> using namespace std; template <typename Arg> void process_recursion(Arg&& arg) { bool lb = std::is_rvalue_reference<decltype(arg)>::value; if (lb) { std::cout << "右值=" << arg << ","; } else { std::cout << "左值=" << arg << ","; } } template <typename First , typename... Rest> void process_recursion(First&& first, Rest&&... rest) { bool lb = std::is_rvalue_reference<decltype(first)>::value; if (lb) { std::cout << "右值=" << first << ","; } else { std::cout << "左值=" << first << ","; } process_recursion(rest...); } int main() { int a = 0; process_recursion(1,a); }
typename ... Args是变长参数包,Args... args是最简单的一种拆包形式。
对于函数模板 template < typename... Args > void test(Args... args);
当调用test(1,‘F‘)时,依次进行实参推演,1被推演成int,‘F’被推演成char,则模板函数被具体化为void test(int ,char);
拆包还有更多的变化,对于template < typename... Args > void test(Args&&... args); 按照万能引用规则拆包。规则见《Effective Modern C++》条款1.
当调用int x=0; test(x,‘F‘)时,依次进行实参推演,x被推演成int&,‘F’被推演成char&& , 则模板函数被具体化为void test(int& ,char&&);
1 template <typename... Types> void func1(std::vector<Types...> v1); 2 3 template <typename... Types> void func2(std::vector<Types>... v2);
对于func1, 只有1个参数v1,Types...拆包成vector类的两个模板参数(一个是所容纳的元素类型,另一个是分配器类型)
对于func2,可能有0个或任意多个参数。例如:func2( std::vector<int> , std::vector<int>, std::vector<char> );