テンプレート
オチもなにもない話です。例えば、ファイルを読む関数で、
001 class File { 002 public: 003 template< typename T > 004 void Read( T& data ){ 005 fread( &data, sizeof(T), 1, fp ); 006 } 007 };
とかいう関数があったとします(不要な部分はかなり中略)。これを使えば、とても簡単にデータを読めます。が、最後の行を見れば分かるように、不審な動きをする可能性があります(実際このコードを試したわけではないので分かりませんが、継承とかすれば確実に駄目です)。
001 int n, char c, ClassA a; 002 File f( "auaua" ); 003 f.Read( n ); 004 f.Read( c ); 005 f.Read( a );
なので、テンプレートの特殊化を行いたいのですが、あいにくテンプレート関数がメンバ関数なので、全く別の関数を間にはさんでやることになります。
001 inline File& operator>>( File& lhs, int& n ) { 002 lhs.Read( n ); 003 return lhs; 004 } 005 // charは略 006 inline File& operator>>( File& lhs, ClassA& a ) { 007 a.ReadFromFile( lhs ); 008 return lhs; 009 } 010 inline File& operator>>( File& lhs, POINT& p ) { // ついでに 011 lhs.Read( p.x ); 012 lhs.Read( p.y ); 013 return lhs; 014 }
そして、ユーザには直接File::Readは触らせないようにします。本当は口で言ってもしょうがないので、呼び出せないような細工をすればいいんですが、面倒なので、なるべく呼び出さないということにします。グローバル関数のない世界の実現は難しいようです。