operator&&のオーバーロード。

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

operator&&のオーバーロード。

投稿記事 by tk-xleader » 14年前

CODE:

#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が両方とも真を返すときに真を返すような関数オブジェクトに評価されるというわけです。

にしてもあんまりいい使い道ではないね…


イテレータに後置インクリメントを使うのはよくない… ので訂正しました。
最後に編集したユーザー tk-xleader on 2011年6月10日(金) 23:40 [ 編集 1 回目 ]

アバター
GRAM
記事: 164
登録日時: 14年前

RE: operator&&のオーバーロード。

投稿記事 by GRAM » 14年前

・・・ちゃんと短絡的評価がされる・・・んですね?
最初おかしいじゃんと思ったんですけどこんなことが可能だということは初めて知りました
なかなか面白いですねw

自分もTMPを始めたばっかりなのでいや~参考になります(こんなことをするべきかはおいておいてw)

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

RE: operator&&のオーバーロード。

投稿記事 by tk-xleader » 14年前

GRAM さんが書きました:・・・ちゃんと短絡的評価がされる・・・んですね?
最初おかしいじゃんと思ったんですけどこんなことが可能だということは初めて知りました
なかなか面白いですねw
短絡評価はされるようですね。実際に "オリジナル" の &&演算子を使っていますから…
実際は、これに限らず、関数オブジェクトの合成というもっと大きな枠組みで考えてもよさそうですね。
GRAM さんが書きました:自分もTMPを始めたばっかりなのでいや~参考になります(こんなことをするべきかはおいておいてw)
問題は、これが本当に勧められるものかどうか?ということなんですよ。
他にも、C++0xならば、このようなことはラムダ式で記述するほうが可読性が上でしょうから、わざわざこんなことするメリットはあるの?というのも有りますけど…