#include
#include
#include
template
class unary_and_functor{
F1 f1;
F2 f2;
public:
unary_and_functor(F1 f1_,F2 f2_):f1(f1_),f2(f2_){}
template
bool operator()(const T& value){
return f1(value) && f2(value);
}
};
template
unary_and_functor make_and_functor(F1 f1,F2 f2){
return unary_and_functor(f1,f2);
}
struct is_odd{
bool operator()(int value)const{
return value%2 == 0;
}
template
unary_and_functor operator&&(F2 f2)const{
return make_and_functor(*this,f2);
}
};
bool is_mod3_2(int value){
return value%3 == 2;
}
//STLにはないので自作
template
void copy_if(InItr begin_itr,InItr end_itr,OutItr out_itr,Pred pred){
for(;begin_itr != end_itr;++begin_itr,++out_itr){
if(pred(*begin_itr))*out_itr = *begin_itr;
}
}
int main(){
std::tr1::arrayar = {1,2,3,4,5,6,7,8,9,10,11,12};
copy_if(ar.begin(),ar.end(),std::ostream_iterator(std::cout,"\n"),is_odd()&&is_mod3_2);
}
2
8
operator&&のオーバーロードによって、次式
is_odd() && is_mod3_2
が関数オブジェクトis_oddと関数is_mod3_2が両方とも真を返すときに真を返すような関数オブジェクトに評価されるというわけです。
にしてもあんまりいい使い道ではないね…
イテレータに後置インクリメントを使うのはよくない… ので訂正しました。