0

一見複雑な問題に悩んでいます。

zip 関数の反復子クラスを作成しようとしています (python のジェネレーター zip 関数を模倣しようとしています)。

私は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 ‘&gt;’ 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

私の質問は、このアプローチは有効ですか? なぜそれが必ずしも間違っているのか、コンパイラーが私に何を求めているのかわかりません。

しかし、それを超えて、私が見逃しているより簡単なアプローチがあれば、それを聞いて大喜びします.

4

2 に答える 2

1

*Tp問題は、 の有効な式ではないことだと思いdecltypeます。

たぶん試してみてくださいdeclval

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

またはイテレータの特徴:

 std::tuple<typename std::iterator_traits<Tp>::value_type...>
于 2013-01-26T19:48:19.153 に答える
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...>

それが役立つことを願っています。

于 2013-01-26T19:52:19.227 に答える