首页 > 解决方案 > 无法使用迭代器标签调度实例化模板

问题描述

我正在尝试为我的线程池实现实现一小组函数,但我无法理解模板应该如何在这里工作。

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视为第三个参数。它甚至不是任何函数中的第三个模板参数。这也不是其他任何事情的第三个论点。

标签: c++templates

解决方案


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;
}

推荐阅读