Рассмотрим следующий код:
template<class T>
vector<T> filter(typename vector<T>::iterator begin,
typename vector<T>::iterator end,
bool (*cond)(T a))
{
vector<T> vec;
for (typename vector<T>::iterator it = begin; it != end; it++) {
if (cond(*it)) {
vec.push_back(*it);
}
}
return vec;
}
vector<int> vec = { 1,2,3,4,5,6,7,8,9,10 };
auto another_vec = filter<int>(vec.begin(), vec.end(), [](int a) {return a > 5; });
Когда я удаляю тип из вызова фильтра функций, код не компилируется, т.е. при написании
filter(vec.begin(), vec.end(), [](int a) {return a > 5; });
Мой вопрос: почему? компилятор может вывести тип как из лямбда-выражения, так и из итератора.
Я получаю ошибку:
Ошибка C2784 'std :: vector>
фильтр (вектор> :: итератор, вектор> :: итератор, BOOL
(__cdecl *) (T)) ': не удалось вывести аргумент шаблона для' bool
(__cdecl *) (T) 'из
'main ::' пример c: \ users \ danii \ documents \ visual
студия 2017 \ projects \ example \ example \ source.cpp 24
Я не смог найти подробности об этой проблеме.
Я думаю, компилятор не может выводить внутренние типы? (например, невозможно вывести int из vector ). Если это так, то почему? если нет, то в чем дело? есть ли способ это исправить?
Еще одна вещь, с которой я столкнулся, это использование самого итератора в качестве шаблона, то есть что-то вроде
template <class T, class iter, class cond>
vector<T> filter(iter begin, iter end, cond c)
Это правильное программирование? Этот код кажется мне немного подозрительным.