Type Erasure(型消去)を使って何でも格納できる型を作成する

要するにVBAでいうVariant型的な物をC++でどう作るのかというお話。この問題に対する設計の定石としては以下のようなクラスを設計することで対応する。

今回は”代入できる”という機能だけ作成。ここにtemplateで指定した型が持つべき関数を規定・制限したり、各種型へのキャストを用意すれば「特定のインターフェイスをもった型だけを格納できる型」として使うこともできて大変便利。Boostライブラリではshared_ptrやその名の通りのanyの実装のために使われている技法。

#include<iostream>
using namespace std;

//自作のAny型
class Any
{
public : 
    template<class T>
    Any(const T & x) : _x(new Any_Derived<T>(x)){}
    ~Any(){delete _x;}
private :
    class Any_Base{
    public : 
        virtual ~Any_Base(){}
    };
    template<class T>
    class Any_Derived : public Any_Base{
    public : 
        Any_Derived(T const & x) : _x(x) {}
    private : 
        T _x;
    };
    Any_Base * _x;
};
//適当な他のクラス
class Hoge{
};
//メイン関数
int main()
{
    //整数・クラスのオブジェクト問わずなんでも入る
    Any x = 4;
    Any y = Hoge();
    return 0;
}

参考
2005-10-03 - Cry’s Diary