C++11包扩展

c++11的包扩展,记录一下代码吧,采用万能引用,万能引用再配合std::forward又是完美转发。我个人还是觉得能清晰表达代码尽量不要用这么奇奇怪怪的语句吧?完美转发可以考虑,确实降低的拷贝的成本。
今天在github看一个人线程池的demo,发现他的线程池里充满了这些奇奇怪怪的写法,明明是一个普普通通的生产者消费者的模型,搞出来了好多奇奇怪怪的东西,要搞得这么复杂?又重新翻了下effective modern C++学了一下包扩展

void fun4() {//fun4要写一个函数的出口(除非函数完整匹配,否则要写一个出口)
	cout << "fun4 stop!" << endl;
}
template<typename ...Args, typename T>
void fun4( T&& t,Args&& ...args) {
	cout << "fun4 T&& :" << t << endl;
	fun4(args...);
}

template<typename Promise,typename ...Args>
decltype(auto) fun3(Promise&& p,Args&& ...args)
					//->decltype(p.get_future()) 
{
	fun4(args...);
	p.set_value(1);
	return p.get_future();
}
/*两种fun3的写法
*template<typename Promise,typename ...Args>
auto fun3(Promise&& p,Args&& ...args)
					->decltype(p.get_future()) 
{
	fun4(args...);
	p.set_value(1);
	return p.get_future();
}
*
*/

int main() {
	
	std::promise<int> p;
	std::future<int> f = fun3(p,2,"hello fun4!");
	cout << f.get() << endl;
	return 0;
}

在附上一个包扩展和完美转发组合的例子吧,因为我觉得一行一行cout太麻烦了,C语言的print也没麻烦,自己写了一个简易的print函数

#include<iostream>
using namespace std;

// 要有一个函数的出口
template<typename T>
void print(const T&& t) {
	cout << t << endl;
}
template<typename T, typename ...Args>
void print(const T&& arg,Args ...args) {
	cout << arg << endl;
	cout << std::is_rvalue_reference<decltype(arg)>::value << endl;
	return print(std::forward<Args>(args)...);
}
template<typename ...Args>
void print(Args ...args) {// 没有这个的话,无法接收const char[]类型,比如main的用例
	return print(std::forward<Args>(args)...);
}
int main() {
	print("hello", "dxgzg");
	return 0;
}

C++17版本的,更加简短了,也不需要函数出口了

template <typename ...Args>
	constexpr void print(Args&& ...args) {
		((std::cout << args << '\n'), ...);
	}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值