Я пытаюсь реализовать небольшой набор функций для реализации моего пула потоков, но я просто не могу понять, как шаблоны должны работать здесь.
namespace async {
template <typename Container>
using iterator_type = typename std::iterator_traits<typename Container::iterator>::iterator_category;
template <typename Container, typename Fn, typename... Args>
void transform(Container& container, Fn&& function, Args&&... args) {
static_assert(std::is_class<Container>::value);
static_assert(std::is_class<typename Container::iterator>::value);
aux::transform(container, std::forward<Fn>(function), std::forward<Args>(args)..., iterator_type<Container>());
}
namespace aux {
template <typename Container, typename Fn, typename... Args>
void transform(Container& container, Fn&& function, Args&&... args, std::random_access_iterator_tag iter_type) {
return;
}
}
}
Это сгенерировало ошибку:
шаблон функции-кандидата недопустим: неизвестное преобразование из 'int' в 'std :: random_access_iterator_tag' для третьего аргумента
std::vector<float> float_vector;
async::transform(float_vector, [](int i) { std::cout << "Text\n"; }, 32);
И это:
шаблон функции-кандидата недопустим: нет известного преобразования из 'std :: _ Vector_iterator>>' в 'std :: random_access_iterator_tag' для 3-го аргумента
void some_function(std::vector<float>::iterator first, std::vector<float>::iterator last) { ... }
std::vector<float> float_vector;
async::transform(float_vector, some_function, float_vector.begin(), float_vector.end());
Почему это не работает? Какой третий аргумент? Я действительно могу sh Я мог бы задать здесь более конкретный c вопрос, но я новичок в программировании на C ++ generi c и просто не могу понять, просто взглянув на него, как std::random_access_iterator_tag
рассматривается как третий аргумент , Это даже не третий параметр шаблона в любой из функций. Это не третий аргумент чего-либо еще.