戻り値のみでは通常オーバーロードはできません。自分自身をテンプレート指定したものを継承するというぱっと聞くと凄く良く分からないお話。boost::functionの話が出てきました。言ってしまえば関数ポインタや関数オブジェクトが渡せるオブジェクトなんですが、それを実現するための実装が凄く難しい。スマートポインタのメモリ解放処理を関数ポインタ(もしくは関数オブジェクト)を渡すことによって専用の解放処理を実行するという話。boost::anyの話が出てきました。なんでも格納できるクラスです。本を参考にしながら出来る範囲内で実装してみます。仮想関数テーブルの話が出てきました。話だけは知っていたのですが、実際のこんな感じという実装を見てイメージが湧きました。何でも保存できるvoid*型を利用したテクニックの話。deleteするときに元の型のデストラクタが呼ばれないのでこのままじゃダメ。Erasureではdeleteする際に元クラスのデストラクタが呼ばれないという問題がありました。非テンプレート基本クラスとテンプレート派生クラスを利用すればこの問題が解決します。Boostにあるenable_ifというメタ関数の話。これはうまい仕組みだなぁ。ここの話はいろいろと面白いですね。beginやendを汎用化して呼び分ける。コードも簡素になるし素晴らしいです。http://d.hatena.ne.jp/pknight/20100323/1269358966続き。お次は継承を利用したポリシーです。前回の記事ではstaticメンバ関数を使用したポリシークラスの実装になっていました。今回はインスタンスメンバを使用した場合のポリシーについてです。しても新しい単語が登場。要約すると同じ関数を持つ別々のクラスを指定できるようにするテンプレートといった感じでしょうか。SFINAEという言葉が出てきました。テンプレートのインスタンス化に失敗した場合に、即エラーにするわけではなく、一旦オーバーロードの候補から外して別のテンプレートをインスタンス化する、という感じですかね。(void*)Pないとで出てきたiterator_traitsを実装してみる。ここは自分なりのサンプルが全然思いつかなかった。意味のないシンプルなコードだけ書いてみた。(void*)Pないとの続きです。今度は型を変換するメタ関数の登場です。テンプレートのインスタンス化を利用して、コンパイル時にプログラミングをすることをテンプレートメタプログラミングという。何か色々できそうな気はするのですが、具体的な利用法が思い浮かばないですね。簡単に言えばオーバーロードを利用した関数の呼び分け処理といった感じでしょうか。シンプルな例を考えてみました。例としてfindを作ってみます。テンプレートの曖昧さ回避のために使用するらしい。コンストラクタテンプレートという名前がついてますが、要はクラステンプレートとメンバ関数テンプレートの合わせ技ですね。テンプレート引数にはコンパイル時に値が確定しているグローバル変数や関数のポインタも渡すことができます。お次はマクロを利用してテンプレートっぽいことをやるという話。いうことで前回の記事で作ったreverseをマクロテンプレートもどきで再実装してみた。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。