c++ - 无法使用迭代器标签分配实例化模板

标签 c++ templates

我正在尝试为我的线程池实现实现一小部分功能,但是我只是不明白模板在这里应该如何工作。

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/

相关文章:

c++ - 尾递归如何真正帮助传统递归?

c++ - Windows下线程创建和终止需要多长时间?

c++ - 错误 C2106 : '=' : left operand must be l-value

c++ - 模板化配置值类和全局列表

python - (如何)我可以使用字符串替换来处理/Django i18n {% trans %} 标签吗?

c++ - 将模板化智能指针类型作为模板参数传递

c++ - 在 Windows Phone 中使用 libsamplerate 对音频重新采样

c++ 实现有界原始类型

c++ - 我可以通过非默认构造函数构造具有零元素的 std::vector

c++ - 稍后添加模板函数的特化