前回に続いて…

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

前回に続いて…

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

もっと調子に乗ってみます。

CODE:

#include
#include
#include
#include

template
class if_functor{
	CondT cond;
	FunctorT functor;
public:
	if_functor(CondT cond_,FunctorT functor_):cond(cond_),functor(functor_),else_(*this){}
	template
	void operator ()(const T& value)const{
		if(cond(value)){
			functor(value);
		}
	}
	template
	class else_functor{
		CondT cond;
		FunctorT functor;
		FunctorT2 functor2;
	public:
		else_functor(CondT cond_,FunctorT functor_,FunctorT2 functor2_):cond(cond_),functor(functor_),functor2(functor2_){}
		template
		void operator()(const T& value){
			cond(value) ? functor(value) : functor2(value) ;
		}
	};
	class else_functor_factory{
		const if_functor&parent;
	public:
		else_functor_factory(const if_functor&parent_):parent(parent_){}
		template
		else_functor operator[](FunctorT2 functor){
			return else_functor(parent.cond,parent.functor,functor);
		}
	}else_;
};

template
class if_functor_factory;

template
if_functor_factory if_(CondT cond){
	return if_functor_factory(cond);
}

template
class if_functor_factory{
	CondT cond;
public:
	template
	if_functor operator[](FunctorT functor){
		return if_functor(cond,functor);
	}
	friend if_functor_factory if_(CondT cond);
private:
	if_functor_factory(CondT &cond_):cond(cond_){}
};

struct is_longer_than_7{
	bool operator()(const std::string& value){
		return value.length() > 7;
	}
};

struct when_longer_than_7{
	void operator()(const std::string& value){
		std::coutarray;
	array.push_back("a");
	array.push_back("abc");
	array.push_back("abcde");
	array.push_back("abcdefg");
	array.push_back("abcdefgh");
	array.push_back("abcdefghij");
	std::for_each(array.begin(),array.end(),
		if_(is_longer_than_7())[
			when_longer_than_7()
		].else_[
			when_shorter_than_8()
		]
	);
}
実行結果
文字列"a"は7文字以下ですね
文字列"abc"は7文字以下ですね
文字列"abcde"は7文字以下ですね
文字列"abcdefg"は7文字以下ですね
文字列"abcdefgh"は7文字より長い
文字列"abcdefghij"は7文字より長い


こんなの使えないけど… boost.lambda使うのがベストだと思います。
最後に編集したユーザー tk-xleader on 2011年6月15日(水) 21:24 [ 編集 1 回目 ]

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

Re: 前回に続いて…

投稿記事 by GRAM » 14年前

こりゃまたカオスですねwww
理解するのにちょっと時間を使いました・・・。
boostのmplライブラリは使われないんですか?
もっと調子に乗ってくださいよ。楽しみにしてますm(_ _)m

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

Re: 前回に続いて…

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

GRAM さんが書きました:こりゃまたカオスですねwww
理解するのにちょっと時間を使いました・・・。
いや、理解するの早くないですか(汗)
だってこれ書くのに40分かかってるんですよ。それをわずか数分で理解してしまうなんて…
GRAM さんが書きました:boostのmplライブラリは使われないんですか?
いずれ使えそうなときになれば使おうとは思っているのですが、使うほどのプログラムを書かないものでして…
GRAM さんが書きました:もっと調子に乗ってくださいよ。楽しみにしてますm(_ _)m
次はこれにelse-ifをつけられるようにしますね。

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

Re: 前回に続いて…

投稿記事 by GRAM » 14年前

>>実行結果から逆にコードを読んでいくと速いですよねw
書けと言われたら自分にはかけるコードじゃないですww(40分とかなおのこと無理w)
構造体の名前とかがわかりやすいのも助かりますね

naohiro19
記事: 256
登録日時: 15年前

Re: 前回に続いて…

投稿記事 by naohiro19 » 14年前

C++0xもしくはVisual C++ 2010だとラムダ関数が使えますよ

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

RE: 前回に続いて…

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

GRAM さんが書きました:実行結果から逆にコードを読んでいくと速いですよねw
書けと言われたら自分にはかけるコードじゃないですww(40分とかなおのこと無理w)
構造体の名前とかがわかりやすいのも助かりますね
いや~GRAMさん寝不足のはずなのにコードの解読早いなぁ…と思ったら、そういうわけですか(凄)
なるほど、実行結果と構造体の名前が分かりやすいからすぐに読めたわけですね。
僕は他人のコードを読むのが苦手で、こんなの読めといわれたらさじを投げそうです。
naohiro19 さんが書きました:C++0xもしくはVisual C++ 2010だとラムダ関数が使えますよ
そうですね、0xのラムダ式を使った方が、可読性も速度(おそらく最適化がこれよりも働きやすいはず…)も向上すると思います。
だからなおさらこんなコードは意味がない… 完全にお遊びの世界ですね…