У меня проблема с, казалось бы, сложной проблемой.
Я пытаюсь создать класс итератора для функции 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
Мой вопрос, является ли этот подход даже действительным? Я не могу понять, почему это обязательно неправильно, или что компилятор хочет от меня.
Но кроме этого, если есть более простой подход, который я пропускаю, я был бы рад услышать это.
Я предполагаю, что проблема в том, что *Tp
не является допустимым выражением для decltype
,
Может быть попробовать declval
?
std::tuple<decltype(*std::declval<Tp>())...>
Или черты итератора:
std::tuple<typename std::iterator_traits<Tp>::value_type...>
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...>
Надеюсь, это поможет.