93561


下記のようにクラスが定義されているとき、main関数内からfunc関数の引数として「クラスの型」を指定することで、func関数内で任意のオブジェクトに対してmake_sharedをしたいのですがどのようにfunc関数を設計すれば宜しいでしょうか？

[code]

    class BaseClass {
        //　メンバー変数
        // メンバー関数
    };
    
    class FirstClass : public BaseClass {
    };
    
    class SecondClass : public BaseClass {
    };
    
    class ThirdClass : public BaseClass {
    };
    
[/code]

[code]

    void func()
    {
        auto ptr = std::make_shared<CLASS_NAME>;
    }
    
    int main(int argc, char *argv[])
    {
        func(CLASS_NAME);　// FirstClass, SecondClass, ThirdClassのいずれか
    }
    
[/code]


CC BY-SA 4.0
2023-01-25T09:53:49.347
93560
2023-01-25T11:12:03.993
2023-01-25T11:12:03.993
3060
55686
question
c++
クラスの型を関数の引数に渡したい


テンプレート関数にして、引数ではなく型引数を受け取ることでしょうか。

[code]

    template<class ClassName>
    void func() {
        auto ptr = std::make_shared<ClassName>();
    }
    
    int main() {
        func<FirstClass>();
    }
    
[/code]

どうしても丸括弧で記述したいならマクロ定義も追加すれば実現できます。

[code]

    #define FUNC(CLASS_NAME) func<CLASS_NAME>()
    
    int main() {
        FUNC(FirstClass);
    }
    
[/code]


CC BY-SA 4.0
2023-01-25T10:07:29.440
93561
2023-01-25T10:07:29.440
4236
93560
answer