我正在尝试为我的线程池实现实现一小部分功能,但是我只是不明白模板在这里应该如何工作。
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;
}
}
}
这产生了一个错误:
candidate function template not viable: no known conversion from 'int' to 'std::random_access_iterator_tag' for 3rd argument
std::vector<float> float_vector;
async::transform(float_vector, [](int i) { std::cout << "Text\n"; }, 32);
还有这个:
candidate function template not viable: no known conversion from 'std::_Vector_iterator > >' to 'std::random_access_iterator_tag' for 3rd argument
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());
为什么这不起作用?什么第三个论点?我真的希望我可以在这里问一个更具体的问题,但是我是C++泛型编程的新手,只是不能仅仅通过将
std::random_access_iterator_tag
视为第3个参数来理解它。在任何函数中,它甚至都不是第三个模板参数。这也不是其他任何事情的第三个论点。
最佳答案
问题在于,您的Args&&... args
函数中的参数包aux::transform
不会出现在模板参数列表的末尾,但是应该出现在模板参数列表的末尾。因此,该函数应如下所示:
template <typename Container, typename Fn, typename... Args>
void transform(Container& container,
Fn&& function,
std::random_access_iterator_tag iter_type,
Args&&... args) {
return;
}
关于c++ - 无法使用迭代器标签分配实例化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60048190/