テンプレートクラスのメソッドをLD_PRELOADで上書きする

動的にリンクされる共有ライブラリの挙動を変える方法として、有名なのがLD_PRELOADで事前に共有ライブラリをロードしておくことです。しかし、C++でテンプレートクラスの挙動を変更する必要があったのですが例があまり見当たらないので記録しておきます。


例えば、以下の様なテンプレートクラスがあります。

// foo.h
template <typename T>
class  Foo {
  public:
    Foo();
    void bar(const T&);
};

このテンプレートクラスの挙動を上書きしたい場合は以下のようにします。(Fooの挙動を変更する場合)

#include "foo.h"

// 挙動を変更するメソッドはFoo<T>などではなく特殊化する
void Foo<int>::bar(const int val&) {
    ...
}
//実際に利用しているクラスを明示的インスタンス化
class Foo<int>;