Factory

メモ.今,以下のようにベースとなるクラス shape と shape を継承した様々なクラスがあります.このとき,プログラムから渡される名前を元にして生成するオブジェクトを変えたい場合,どう書くのがベストなのかな・・・

class shape;
class triangle : public shape;
class rectangle : public shape;
class pentagon : public shape;
class circle : public shape;
...

今のところ,以下のような makeshape 関数を定義しています.

template <class Ch, class Tr>
shared_ptr<shape> makeshape(const std::basic_string<Ch, Tr>& name) {
    typedef shared_ptr<shape> shape_ptr;
    if (name == "triangle") return shape_ptr(new triangle());
    if (name == "rectangle") return shape_ptr(new rectangle());
    if (name == "pentagon") return shape_ptr(new pentagon());
    if (name == "circle") return shape_ptr(new circle());
    ...
    
    return shape_ptr();
}

数が少なければこれでも良いかなと思ってたのですが,どうやら渡される名前は 200 種類位あるらしく,この形では不格好だなぁ・・・と悩んでるところ.名前に対して一意の番号を割り振って,

int type = gettype(name);
return shape_ptr(new extended_shape<type>());

のように書けたら良いなぁと思ったのですが,コンパイル時に type の値が決定しないのでやはりダメですね.何か良い方法があれば書き換える方向で.