たとえばstd::tuple
のfold
関数を書きたいと思っていました。指定されたタプル内のすべての要素の合計(または積)。例えば、C++タプルのfold/sum関数の記述方法は?
std::tuple<int,double> t = std::make_tuple(1,2);
与えられた私は
auto s = sumT(t); //giving 3
私が試したが、コンパイルするには、以下の私のテンプレートプログラミング(C++ 11/1Z)コードを取得できませんでしたを計算したいと思います。私はまた、私の他の質問(How to perform tuple arithmetic in C++ (c++11/c++17)?)のために受け入れられた答えを適応させようとしましたが、この場合にstd::index_sequence
の使い方を理解することはできません。
私がしているしている問題:
1)私は、例えば、種類を把握することはできません戻り値の型として最初の要素の型を使用する方法。現在、私は_res
型をテンプレートに使用していますが、C++の自動型推論をブロックするかどうかはわかりません。
2)明示的な初期要素0
を使用せずにこれをプログラムしたいので、これは他の種類のfold
操作に使用できます。
現在、再帰は最後の要素で終了します。私は_size - 1
で再帰を終了したいので、0
に頼らずに最後の要素の操作を直接実行することができます。
以下のコードでは、再帰によってこれを実行しようとしています。しかし、私はテンプレートプログラミングをよく知っていませんし、ループがタプルのためにどのように機能するかはわかりません。
誰かがコードを修正したり、より良い解決策を考えたりできますか?
私のコードは、これまでのところです:
#include <tuple>
#include <iostream>
#include <functional>
// helper class for fold operations
template<typename Op,typename _res, typename _Tp, size_t _i, size_t _size>
struct _tuple_fold {
static constexpr _res _op(Op const & op, const _Tp& _t) {
return _res(op(std::get<_i>(_t),
_tuple_fold<Op, _res, _Tp, _i + 1, _size>::_op(op,_t)));
}
};
template<typename Op,typename _res,typename _Tp, size_t _size>
struct _tuple_fold<Op, _res,_Tp, _size, _size> {
static constexpr _res _op(Op const &, const _Tp&) { return 0; }
};
template <typename ... Ts>
auto sumT (std::tuple<Ts...> const & t1) {
return _tuple_fold::_op(std::plus<>{}, t1);
}
int main() {
std::tuple<int,double> t = std::make_tuple(1,2);
auto s = sumT(t);
std::cout << s << std::endl;
}
g++ -std=c++17 tuple_sum.cpp
でコンパイルするためのエラーメッセージ:
tuple_sum.cpp: In function ‘auto sumT(const std::tuple<_Elements ...>&)’:
tuple_sum.cpp:21:10: error: ‘template<class Op, class _res, class _Tp, long unsigned int _i, long unsigned int _size> struct _tuple_fold’ used without template parameters
return _tuple_fold::_op(std::plus<>{}, t1);
^
tuple_sum.cpp: In function ‘int main()’:
tuple_sum.cpp:27:19: error: ‘void s’ has incomplete type
auto s = sumT(t);
^
私は呼び出しサイト上_tuple_fold
の型パラメータを指定するかどうかはわかりません特にstd::plus
のタイプです。
[STD ::累算](http://en.cppreference.com/w/cpp/algorithm/accumulate)はラムダでうまくいくと思います。 –
@JesperJuhlいいえ、etherogeneousコンテナ(タプルのような)から普通のイテレータを取ることはできません –