#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
#include <iterator>
#include <algorithm>
template <class F, class DelimT, class T>
class predicate_iterator : public std::iterator<std::output_iterator_tag, std::basic_ostream<T>>
{
public:
predicate_iterator(F func) : func_(func), delim_(default_delim_), os_(std::cout) { }
predicate_iterator(F func, DelimT delim) : func_(func), delim_(delim), os_(std::cout) { }
predicate_iterator(F func, std::basic_ostream<T> &os) : func_(func), delim_(default_delim_), os_(os) { }
predicate_iterator(F func, DelimT delim, std::basic_ostream<T> &os) : func_(func), delim_(delim), os_(os) { }
predicate_iterator operator ++ (int) { return *this; }
predicate_iterator operator ++ () { return *this; }
predicate_iterator operator * () { return *this; }
void operator = (T obj) { if (func_(obj)) os_ << obj << delim_; }
private:
const std::string default_delim_ = ", ";
std::basic_ostream<T> &os_;
DelimT delim_;
F func_;
};
template <class F, class DelimT, class T>
predicate_iterator<F, DelimT, T> create_predicate_iterator(F f, const DelimT delim, std::basic_ostream<T> &obj)
{
return predicate_iterator<F, DelimT, T>(f, delim, obj);
}
std::ostream &operator <<(std::ostream &os, const char *str)
{
auto it = create_predicate_iterator(isupper, std::string(), os);
std::copy(str, str + strlen(str), it);
return os;
}
int main()
{
using namespace std;
cout << "this is just A message to Prove that you can Print to the consoLe with prEdicate iteratorS." << endl;
}