Проблема с компиляцией с кортежами и шаблонами с переменными значениями

У меня проблема с, казалось бы, сложной проблемой.

Я пытаюсь создать класс итератора для функции zip (пытаюсь имитировать функцию zip генератора Python).

У меня весь класс в http://ideone.com/c7rm40

  template<size_t I = 0, typename... Tp>
inline typename std::enable_if<(I == sizeof...(Tp)), typename std::tuple<decltype(*Tp)...>>::type
constructImpl(std::tuple<Tp...> const& its) {

core/StarAlgorithm.hpp|550 col 3| error: expected ‘(’ before ‘constructImpl’
core/StarAlgorithm.hpp|550 col 3| error: expected ‘>’ before ‘constructImpl’
core/StarAlgorithm.hpp|550 col 45| error: template argument 2 is invalid
core/StarAlgorithm.hpp|550 col 47| error: expected ‘::’ before ‘{’ token
core/StarAlgorithm.hpp|550 col 47| error: expected identifier before ‘{’ token
core/StarAlgorithm.hpp|550 col 47| error: expected unqualified-id before ‘{’ token

Мой вопрос, является ли этот подход даже действительным? Я не могу понять, почему это обязательно неправильно, или что компилятор хочет от меня.

Но кроме этого, если есть более простой подход, который я пропускаю, я был бы рад услышать это.

0

Решение

Я предполагаю, что проблема в том, что *Tp не является допустимым выражением для decltype,

Может быть попробовать declval?

std::tuple<decltype(*std::declval<Tp>())...>

Или черты итератора:

 std::tuple<typename std::iterator_traits<Tp>::value_type...>
1

Другие решения

typename std::tuple<decltype(*Tp)...>>::type

Это вообще не имеет смысла, потому что:

  • Tp это аргумент типа, так *Tp не имеет никакого смысла.

  • std::tuple не имеет вложенных ::type, Так std::tuple<whatever>::type не имеет смысла.

На основании ваших комментариев я Угадай тебе нужно std::iterator_traits как:

std::tuple<typename std::iterator_traits<Tp>::value_type...>

Надеюсь, это поможет.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector