Предположим, я хочу сделать частичное применение функции , чтобы широкий спектр функций соответствовал одной сигнатуре.
Например, я мог бы захотеть go из двойной Функция параметра для функции с одним параметром выглядит следующим образом:
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
, определил его как шаблонную функцию variadi c:
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
передается в качестве второго аргумента в примере выше?