c++ - 无法使用迭代器标签调度实例化模板
问题描述
我正在尝试为我的线程池实现实现一小组函数,但我无法理解模板应该如何在这里工作。
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' 的已知转换
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
视为第三个参数。它甚至不是任何函数中的第三个模板参数。这也不是其他任何事情的第三个论点。
解决方案
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;
}
推荐阅读
- visual-studio-2017 - 录制的视频所在的单元测试
- c++ - Linux 内存映射文件消耗的磁盘比预期的要多
- python - 我们可以在“set”,“list”和“tuple”上使用python中的特殊方法吗?
- android - 将 admob 原生广告添加到回收站视图后,Android 获得正确的项目位置
- python - 如何使用 Python Cryptography 在没有后端(或使用什么后端)的情况下加载 der 证书
- java - Java SSHJ 库和启用日志记录
- mysql - SQL查询日期时间选择24小时前
- c - 在 C 中为多个变量定义条件时出现问题
- uwp - 如何防止我的 UWP 应用全屏显示?
- r - 根据时间间隔组合行值