C++11中可变参数模板使用

在看同事编写的代码,发现有如下的代码,因为没用过,所以查了一下这是什么语法,通过查询资料知道了这是C++11中增加的可变参数模板。

 template<class T, class ...Args>
bool GetValue(T &value, Args &&...args) const;

template<class T, class ...Args>
static bool GetValue(T &value, const nlohmann::json &jsData, Args &&...args);

C++11以前,类模板和函数模板只能含有固定数量的模板参数,虽然类型灵活了但是个数不灵活,不够完美,可变参数模板允许模板定义中包含0到任意个模板参数,解决以前模板参数个数不灵活的的缺陷。

1.可变参数模板写法

情况一:完全泛化

template<typename... Types>

或者
template<class ...Args>

情况二:部分泛化

template<typename T, typename... Types>

或者
template<class T, class ...Args>

2.可变参数模板使用

2.1 函数模板的使用

举例一:

 #include <iostream>
 #include <string>

 using namespace std;

void MyPrint() {}

template<class T, class... Args>
void MyPrint(const T& firstArg, const Args&... args) {
	std::cout << firstArg << " " << sizeof...(args) << std::endl;
	MyPrint(args...);
}

int main()
{
    MyPrint(111, 222, 333, 444, 555, 666);
    return 0;
}

运行结果:

 

举例二:找出一堆数中最小的一个

#include <iostream>

template <typename T>
T MyMin(T value) {
  return value;
}

template <typename T, typename... Types>
T MyMin(T value, Types... args) {
  return std::min(value, MyMin(args...));
}

int main(int argc, char *argv[]) {
    std::cout << MyMin(56, 23, 5, 17, 678, 9) << std::endl;
    
    return 0;
}

运行结果如下:

 

2.2 类模板使用

举例:

#include <iostream>

template<typename... Values> class MyTuple;
template<> class MyTuple<> {};

template<typename Head, typename... Tail>
class MyTuple<Head, Tail...>
  : private MyTuple<Tail...>
{
  typedef MyTuple<Tail...> inherited;
  public:
    MyTuple() {}
    MyTuple(Head v, Tail... vtail) : m_head(v), inherited(vtail...) {}
    Head& head() {return m_head;}
    inherited& tail() {return *this;}
  protected:
    Head m_head;
};

int main(int argc, char *argv[]) {
	MyTuple<char, int, float, std::string> t('A', 888, 3.1415926, "hello world");
	std::cout << t.head() << " " << t.tail().head() << " " << t.tail().tail().head() << 
    " " << t.tail().tail().tail().head() << std::endl;

	return 0;
}

运行结果如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值