码迷,mamicode.com
首页 > 编程语言 > 详细

C++ variadic template

时间:2018-03-04 19:58:04      阅读:181      评论:0      收藏:0      [点我收藏+]

标签: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

标签:types   type   col   its   oid   变化   func   iostream   style   

原文地址:https://www.cnblogs.com/thomas76/p/8505578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!