【发布时间】:2020-04-01 19:42:45
【问题描述】:
假设我想做partial function application 以使各种函数符合单个签名。
例如,我可能想从一个双参数函数转到一个单参数函数,如下所示:
std::function<int(int, int)> doubleFoo = [](int i, int j) { return i + j; };
// Turn the function into a single-parameter function, using j = 5
std::function<int(int)> singleFoo = toSingleFoo(doubleFoo, 5);
由于我希望 toSingleFoo 处理任何第一个参数是 int 的单参数或多参数函数,因此我将其定义为可变参数模板函数:
template <typename... Args>
std::function<int(int i)> toSingleFoo(std::function<int(int, Args&&...)> multiFoo, Args&&... args)
{
auto singleFoo = [args](int i) { multiFoo(i, std::forward<Args>(args)...) };
return singleFoo;
}
但是,这会产生以下编译器错误(使用 Visual Studio 2017,版本 15.7.6):
error C2672: 'toSingleFoo': no matching overloaded function found
error C2784: 'std::function<int (int)> toSingleFoo(std::function<int(int,Args &&...)>,Args &&...)':
could not deduce template argument for 'std::function<int(int,Args &&...)>'
from 'std::function<int (int,int)>'
为什么编译器无法推导出模板参数,尽管在上面的示例中将 int 作为第二个参数传递?
【问题讨论】:
标签: c++ c++11 variadic-templates