標籤:types type col its oid 變化 func iostream style
#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> );
C++ variadic template