Хотя я считаю, что использование функции в качестве другого параметра шаблона, предложенного @DeiDei, является лучшим решением, здесь есть альтернатива:
Если вы хотите, чтобы VarType
выводился из первой функции параметр, тогда вы можете сделать второй параметр не выводимым контекстом:
template <class VarType>
void each(vector<vector<VarType>> &ve,
typename type_identity<function<void (VarType &)>>::type action) {
for(vector<VarType> &v : ve) {
for(VarType &p : v) {
action(p);
}
}
}
Для этого требуется C ++ 20 для std::type_identity
и #include<type_traits>
, но вы можете легко реализовать свой собственный type_identity
:
template<typename T>
struct type_identity {
using type = T;
};
Это работает, потому что все, что осталось для оператора разрешения области действия ::
, представляет собой невнедренный контекст, означающий, что параметры шаблона в нем не будут выведены из этого параметра функции. Ваша исходная функция не может быть выведена из аргумента шаблона, поскольку VarType
не может быть выведена из второго параметра, так как второй аргумент функции, указанный в вызове, на самом деле не имеет тип std::function<...>
.