タグ

ブックマーク / blog.cryolite.net (3)

  • Type Erasure - 型消去 - Cry's Blog

    C++ でテンプレートを使えば静的にポリモーフィックな Duck Typing というか,ある構文が有効であれば継承関係も何も無くても O.K. (専門用語で言えば,あるコンセプトのモデルを全て受け付ける)というコードを書くのは非常に簡単.ただし,一方で静的多相であること(コンパイル時決定であり,型の情報を引きずり倒さなければならない)が欠点となる状況も多い.動的多相が実現できない,コードの肥大化(code bloat)がある,など. #後日注釈 (2005/11/17):実装をヘッダに書かないといけないという制約も大きい. 一方で C++ において,継承関係のないクラス間で動的多相を行う手法がないかというとそういうことはない.これを実現する技法は自分が知っている範囲で2つ.どちらも個人的に「型消去 (Type Erasure)」と呼んでる(で,実際にそう呼ばれることがある)技法. 1つは

    Type Erasure - 型消去 - Cry's Blog
    aont
    aont 2014/08/07
  • 動的削除子 (dynamic deleter) - 意外と知られていない? boost::shared_ptr の側面 - Cry’s Diary

    boost::shared_ptr は動的削除子 (dynamic deleter) と呼ばれる技法に基づいて実装されています.この動的削除子という技法で重要なのは, boost::shared_ptr が最終的に呼び出す解放処理が boost::shared_ptr のテンプレート引数の型に関係なく,コンストラクタに実際に渡されたポインタの型で,かつ boost::shared_ptr のコンストラクタの呼び出しの段階で 決定する,ということです. 以下のようなコードが,動的削除子の効果が一番分かりやすい例になるでしょう. class X{ public: ~X() { std::cout << "X::~X" << std::endl; } }; class B{ public: ~B() // virtual でないことに注意!! { std::cout << "B::~B" <<

    動的削除子 (dynamic deleter) - 意外と知られていない? boost::shared_ptr の側面 - Cry’s Diary
    aont
    aont 2014/07/31
    ということは (X*)new D を渡すとアウト? あ、でも仮想デストラクタなら大丈夫か。
  • 関数へのポインタによるコールバックをインライン化する - Cry's Blog

    関数ポインタとコールバックとインライン化と C++,特にSTLではコールバックにファンクタを使用することが推奨されています.コールバックにファンクタを用いることの利点は大きく次の2つだと思われます. コールバックがインライン化される(ただしあくまで「かも知れない」) 各種のアダプタを適用できる 以下では主に前者について,関数ポインタを用いたコールバックをインライン化できないかを考えます. そもそも,インライン化したい関数というのは短い簡潔な関数のはずで,そういった関数のインライン化のためだけにstructごにょごにょ,operator()うにゃうにゃとやるというのは面倒だなぁ,関数ぺぺっと書きたいな,というモチベーションは十分にありえるかと思われます. さて,関数ポインタ経由での関数呼び出しは通常インライン化されないと考えられます.これは関数ポインタ経由の場合,実行時まで呼び出す関数のアド

    関数へのポインタによるコールバックをインライン化する - Cry's Blog
  • 1