【发布时间】:2014-08-20 14:48:11
【问题描述】:
在回答this question 时,我编写了这个工作代码,包装了传入模板参数的函数:
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';
}
两个人告诉我使用完美转发。当我问如何做到这一点时,其中一位重定向了我here。我阅读问题,仔细阅读最佳答案,并将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...));
}
它会编译,除非我尝试使用上面的示例代码检查它。 如何修复代码?
【问题讨论】:
标签: c++ c++11 wrapper variadic-templates perfect-forwarding