相关疑难解决方法(0)

使用前进的优点

在完美转发中,std::forward用于转换命名的右值引用t1t2未命名的右值引用.这样做的目的是什么?inner如果我们离开t1&t2作为左值,那将如何影响被调用的函数?

template <typename T1, typename T2>
void outer(T1&& t1, T2&& t2) 
{
    inner(std::forward<T1>(t1), std::forward<T2>(t2));
}
Run Code Online (Sandbox Code Playgroud)

c++ c++-faq rvalue-reference perfect-forwarding c++11

411
推荐指数
6
解决办法
6万
查看次数

无法为包装函数添加完美转发

在回答这个问题时,我编写了这个工作代码,包装函数在模板参数中传递:

template<typename Fn, Fn fn, typename... Args>
auto wrapper(Args... args)->decltype(fn(args...)){
    return fn(args...);
}
#define WRAPPER(FUNC) wrapper<decltype(&FUNC), &FUNC>
Run Code Online (Sandbox Code Playgroud)

用法示例(我使用此代码进行测试):

int min(int a, int b){
    return (a<b)?a:b;
}

#include<iostream>
using std::cout;
int main(){
    cout<<WRAPPER(min)(10, 20)<<'\n';
}
Run Code Online (Sandbox Code Playgroud)

两个人告诉我使用完美转发.当我问到如何做到这一点时,其中一个人将我重定向到这里.我读了问题,仔细阅读了最佳答案,并改为wrapper:

#include<utility>
template<typename Fn, Fn fn, typename... Args>
auto wrapper(Args&&... args)->decltype(fn(std::forward<Args...>(args...))){
    return fn(std::forward<Args...>(args...));
}
Run Code Online (Sandbox Code Playgroud)

它编译,除非我尝试使用上面的示例代码检查它.我该如何修复代码?

http://rextester.com/YUIYI99787

c++ wrapper variadic-templates perfect-forwarding c++11

3
推荐指数
1
解决办法
439
查看次数