一部のアルゴリズムは実際に連鎖可能であり、それらはビューおよび/またはアクションの名前空間にあります。
しかし、あなたのコードは、実際には別の質問があることを示唆しています。パイプチェーンを終了できる署名付きのアルゴリズムがないのはなぜですか? reducer
そのようなアルゴリズムの名前空間を提案します。動作するコード例を次に示します。
#include <iostream>
#include <string>
#include <vector>
#include <range/v3/all.hpp>
using namespace std;
namespace view = ranges::view;
namespace action = ranges::action;
namespace reducer {
template <typename T>
class count {
T t;
public:
count(T t) : t(t) {}
template <typename Left>
T operator()(Left left) {
return ranges::count(left, t);
}
};
template <typename Left, typename T>
int operator|(Left left, count<T> right) {
return right(left);
}
}
int main (int argc, char * argv[])
{
const auto ints = std::vector<int>{1,2,1,3,1,4,1,5,1,6};
const auto num_ones = ints | reducer::count(1);
cout << num_ones << endl;
return 0;
}
Eric Niebler は、私たちと同じように、人々は多くのアイデアを思いつきでぶちまけますが、深刻な結果を目にすることはないと言いました。ですから、私たちが見えないという考えには何か悪いことがあるのではないでしょうか。彼があなたの質問を通り過ぎて、コメントで私たちを啓発してくれたら素晴らしいでしょう.
もちろん、彼は range-v3 に C++11 を使用しており、コンストラクターの型推定がなければ、このアイデアを実装するのは困難です。