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'), ...);
}