関数のキャスト
私が一方的にフォローしてる人の,
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でコンパイル通ったから(今は)あんまり追求しませんが...