DEV Community

Ariston
Ariston

Posted on • Edited on

c++模板

C++是真的他妈难学啊,总是有一堆莫名其妙的东西,他妈的编译原理也是一脸懵逼。

尾随返回类型

int add (int a, int b){
return a + b;
}
//像这种,返回类型都是放在前面的
auto myFunction() -> int{
return 5;
}//目前没懂这是为了干啥,放屁吗在那,看鸿蒙的代码也没懂,也没用这些东西啊操
Enter fullscreen mode Exit fullscreen mode

decltype

result_of

用于推断函数调用的返回类型

result_of<F(Args...)>::type  
Enter fullscreen mode Exit fullscreen mode

其中result_of是一个模板结构体,而不是一个类型,
而我们引出来的type才是一个F(Args...)返回的类型

std::result_of<decltype(multiply)&(int, int)>::type
//decltype适用于推断类型的,那么为什么还要在后面加上(int,int)呢?
//是因为有可能遇到函数重载,想象一下multiply有参数类型为double和参数
//类型为int的情况。
auto enqueue(F&& f, Args&&... args) 
        -> std::future<typename std::result_of<F(Args...)>::type>; 
//关于这段代码为什么F能被推断为是函数,是因为F(Args...)
Enter fullscreen mode Exit fullscreen mode

future

与并发编程相关的模板类,当启动一个异步操作时,我们会得到一个future对象,
当这个get出结果的时候,

future<int> fu = async(compute);
auto ret = fu.get();//假设compute是一个函数返回的是int类型,
Enter fullscreen mode Exit fullscreen mode

通用引用(转发引用)
看上去是右值引用,但是既可以绑定右值也可以绑定左值,通常与forward一起用

template<typename T>
void wrapper(T&& arg){
somefunction(forward<T>(arg));
}
Enter fullscreen mode Exit fullscreen mode

forward是不会改变参数是左值还是右值,完美的保留了参数的原始类型和值类别。

packaged_task

既能封装函数也能封装对象,实现异步编程的强大工具,特别是在需要异步执行任务并在将来某个时刻获取其结果的场景中。

bind

参数是函数和若干参数,返回值类型是函数对象。

Top comments (0)