Не удается создать экземпляр шаблона с отправкой тега итератора - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь реализовать небольшой набор функций для реализации моего пула потоков, но я просто не могу понять, как шаблоны должны работать здесь.

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 рассматривается как третий аргумент , Это даже не третий параметр шаблона в любой из функций. Это не третий аргумент чего-либо еще.

1 Ответ

2 голосов
/ 04 февраля 2020

Проблема в том, что ваш пакет параметров 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...