C++可变参数模板初探

最近在往工程里面添加日志功能,很自然地挪用了以前写地日志库,大体上可以参考之前的文章:基于spdlog实现日志控制台输出、文件输出或控制台+文件同时输出

每到这时候,就会发现坚持输出的好处,遇到同类问题,直接参考以前发表的内容,拿来主义,省时省力,免得再一遍一遍吭哧吭哧重复造轮子,节省下的时间和精力,可以去迎接更多更新的挑战。在工作中,也经常鼓励团队成员多输出文档,尽量把自己做熟的工作标准化、可移交,因为工作本身就是一个学习的过程,不能总是抱着一个技能死守一片阵地,总要想着法子往更深、更广的方向发展。

好了,回到C++可变参数模板的主题。在之前的Log功能封装里,对于打印功能的封装,有类似如下的函数定义:

	template<typename... Args>
	inline void print_info(string_view_t fmt, const Args &... args)
	{
		if(ai_logger)
		{
			ai_logger->info(fmt, args...);
		}
		else
		{
			cout << "print_info failed. Logger is not created yet." << endl;
		}
	}

可变参数模板其实以前用得比较少,今天刚好下班有一点时间,稍微研究一下。

可变参数模板是C++11的新特性之一,强大的泛化功能为我们的日常编程提供了更多便利,当然,也顺便加重了学习负担,哈哈。

可变参数模板允许包含0到多个模板参数,其写法如同上面的代码示例,声明时在typename或class后面加上三个点“...”,template<typename...> 或 template<class...>;在使用模板定义时,则使用模板类型+形参的形式,这一点和我们熟悉的非可变参数的定义一致,只是类型后面也要加“...”,后面跟形参,形参数量与类型数量保持一致。如,

template<typename... T>
void test_template(T... args)

上面语句中,T即为类型,args即为T类型对应的参数,T... args作为一个pack,展开后则为T1 arg1, T2 arg2, T3 arg3...的形式。

用一个小例子说明一下可变参数模板的基本用法:

#include <iostream>

using namespace std;


//递归终止函数
void print_args()
{
   cout << "null" << endl;
}

/* 以递归函数形式打印可变参数 */
template <class T, class ...Args>
void print_args(T head, Args... args)
{
   cout << head << endl;
   print_args(args...);
}


template<typename... T>
void test_template(T... args)
{
	cout << "arg size: " << sizeof...(args) << endl;
	print_args(args...);
}


int main()
{
	print_args();
	print_args("Hello world!");
	print_args(1, 2.0, "Hi Grace");
	
	test_template(3, 4.0, 5, "hello template.");
	
	return 0;
}

上面例子中展示了使用递归方式打印模板参数的方法(print_args),以及调用模板函数的方法(test_template中调用print_args)以及使用sizeof统计args数量的方法。 

执行结果:

另外一种打印可变参数模板的方法如下, 

template<typename... T>
void print_args_2(T... args)
{
	((cout << args << " "), ...);   //第二种打印可变参数模板的方法
	cout << std::endl;
}

int main()
{
	print_args_2(6.05, 7, 8.345678, "Hello C++17!");
	
	return 0;
}

 但该方法只能被C++17以上支持,使用C++11编译会报warning:

 可以使用-std=c++17编译,编译完成后,运行输出如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值