テンプレート

オチもなにもない話です。例えば、ファイルを読む関数で、

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は触らせないようにします。本当は口で言ってもしょうがないので、呼び出せないような細工をすればいいんですが、面倒なので、なるべく呼び出さないということにします。グローバル関数のない世界の実現は難しいようです。