在回答这个问题时,我编写了这个工作代码,包装函数传入模板参数:
template<typename Fn, Fn fn, typename... Args>
auto wrapper(Args... args)->decltype(fn(args...)){
return fn(args...);
}
#define WRAPPER(FUNC) wrapper<decltype(&FUNC), &FUNC>
示例用法(我使用此代码进行测试):
int min(int a, int b){
return (a<b)?a:b;
}
#include<iostream>
using std::cout;
int main(){
cout<<WRAPPER(min)(10, 20)<<'\n';
}
两个人告诉我使用完美转发。当我问如何做到这一点时,其中一位将我重定向到这里。我阅读问题,仔细阅读最佳答案,并更改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...));
}
它会编译,除非我尝试使用上面的示例代码检查它。如何修复代码?