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'), ...);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在VS Code中配置C/C++扩展,首先需要下载C/C++的开发环境,并将其添加至系统变量中。可以按照以下步骤完成配置: 1. 首先,下载并安装VS Code。可以从官方网站上下载适用于您的操作系统的安装程序。 2. 安装C/C++扩展。在VS Code中,点击左侧的扩展图标(四个方块连接在一起的图标),搜索并选择"C/C++"扩展进行安装。 3. 下载C/C++开发环境。根据您的操作系统,选择合适的C/C++开发环境。可以选择GCC、Clang或者MSVC等编译器。 4. 将C/C++开发环境添加至系统变量中。具体的方法取决于您的操作系统。在Windows上,可以将C/C++开发环境的路径添加至系统环境变量中。在Linux上,可以通过编辑.bashrc文件或者其他shell配置文件来添加环境变量。 5. 在VS Code中配置C/C++扩展。在VS Code中,打开"Command Palette"(快捷键Ctrl+Shift+P),输入"Edit C/C++ configurations"并选择该选项。然后,选择"gcc"或者"clang"作为编译器,根据需要设置其他配置选项,如编译参数等。 通过以上步骤,您就可以成功配置C/C++扩展并开始在VS Code中进行C/C++编程了 [1。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [VSCode的C/C++扩展功能](https://blog.csdn.net/qq_28087491/article/details/123049870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【开发工具 - vscode】vscode配置C/C++环境](https://blog.csdn.net/qq_62094479/article/details/127816434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值