今夜はptr_funメモ

やあみんなfloat値やdouble値の符号を反転する最も評価されるやり方はやっぱり、f=-f なのだろうか?あるいは f*=-1.0 かな?(←まさかね)。32ビットマシンと64ビットマシンが錯綜する昨今、符号ビット直狙いで反転なんて怖いことしたくないしね。どうなんだろ?
そんなことはさておき、今夜はptr_funについてのメモだよ。ファンクタを書いていると「その辺に落ちている普通の関数の関数ポインタをそのまま関数オブジェクトにしてくれる便利アダプタはないのかな?」という疑問が浮かんでくるわけだが、まさにそのようなことをやってくれるのが、ptr_funだよ。これは1引数と2引数の関数に対応してるみたいだ。早速試してみたぞ。

#include <iostream>
#include <algorithm>
#include <vector>
//#include <iterator>
#include <functional>
//#include <numeric>
using namespace std;
using namespace std::tr1;
using namespace std::tr1::placeholders;

void tako ( int num )
{
  cout << " said "<< num <<endl;
}

void taro ( int a, int b )
{
  cout << " sum: "<< a << " + " << b << " = " << a+b <<endl;
}

class A{};

A operator*( const float a, const A& b )
{
  return a*b;
}

int main( void )
{
  ptr_fun( tako )( 77 );// 1引数関数も
  ptr_fun( taro )( 77, 88 );// 2引数関数も
  ptr_fun( operator* ) ( 1.0, A() );// 演算子定義も
  return 0;
}

なるほど独自に定義した演算子までをも関数オブジェクト化してくれるってわけだ。へっ!こいつはなかなか使えそうだぜ!
VisualStudio2008SP1だと、例えばptr_funの上にマウスカーソルを置いて、「定義へ移動」をするだけで、ptr_funのソースがすぐさま見れてしまうから便利だね。この手の標準のテンプレートの実装を見る分には本当に重宝するよ。