関数のキャスト

私が一方的にフォローしてる人の,

void を返す関数を bool を返す関数にキャストして呼び出した返り値は false になって欲しいがたぶんそうならない…

frsyukiさんのつぶやき

というのを見て,
出来そうだと思ったので作ってみた.
何に使うのかは知りません.

#include <iostream>
#include <boost/function.hpp>
#include <boost/utility/value_init.hpp>

using namespace std;

namespace KSTM { namespace utility {

template< typename R, typename A > // A...
boost::function<R(A)> return_cast ( void(f)(A) )
{
	class converter {
		boost::function<void(A)> f_;
	public:
		converter(boost::function<void(A)> F) : f_(F)
		{}

		R operator()( int N )
		{
			f_(N);                   // 引数を渡して実行して,
			return boost::value_initialized<R>();  // 初期化値(本来の目的はfalse)を返す
		}
	};
	return (converter(f)); // ここでfを渡さないと,関数内クラスからfにアクセスできない.
	                       // 考えてみればこれが出来たらClosure出来ちゃうねぇw
}

} // namespace 'utility'
} // namespace 'KSTM'

void print(int x){
	cout << "call print " << x << endl;
}

int main(){

	using namespace KSTM::utility;

	// void = print(256);                    // ホントは戻り値なんて無いけど,
	bool flag = return_cast<bool>(&print)(5);// return_castすると...
	if(flag==true){
		cout << "true  :)" << endl;
	}else{
		cout << "false :(" << endl;          // falseを返しますb
	}

	return (0);
}

これは趣味で書いてしまっただけのコードです.
あぁ, ごめんなさい. ごめんなさい. orz


ところで関数内でクラス定義とか,テンプレートパラメータを部分的に渡すとかしていいんだっけ?
VC2008でコンパイル通ったから(今は)あんまり追求しませんが...