[모던C++입문] 6.4 서브 타입별 동적 선택

    6.4 서브 타입별 동적 선택

    • switch문을 이용해 프로그램을 동적으로 선택하도록 구현해보자.
    class matrix {};
    class vector {};
    
    void cg(const matrix& A, const vector& b, vector& x);
    void bicg(const matrix& A, const vector& b, vector& x);
    
    struct solver
    {
        virtual void operator()(const matrix& A, const vector& b, vector& x)= 0;
        virtual ~solver() {}
    };
    
    // 잠재적으로 템플릿화 됨
    struct cg_solver : solver
    {
        virtual void operator()(const matrix& A, const vector& b, vector& x) override 
        { cg(A, b, x); }    
    };
    
    struct bicg_solver : solver
    {
        virtual void operator()(const matrix& A, const vector& b, vector& x) override 
        { bicg(A, b, x); }    
    };
    
    
    int main (int argc, char* argv[]) 
    {
        using namespace std;
        matrix A;
        vector b, x;
    
        int solver_choice= argc >= 2 ? std::atoi(argv[1]) : 0;
        //일반적인 처리
        //복잡도에따라 확장하기 어렵다.
        switch (solver_choice) {
          case 0: cg(A, b, x); break;
          case 1: bicg(A, b, x); break;
        }
    
        // 팩토리 패턴 (C++11)
        unique_ptr<solver> my_solver;
        switch (solver_choice) {
          case 0: my_solver= unique_ptr<cg_solver>(new cg_solver); break;
          case 1: my_solver= unique_ptr<bicg_solver>(new bicg_solver); break;
        }
    
        // 팩토리 패턴 2
        //make_unique를 사용 (C++14)
        unique_ptr<solver> my_solver;
        switch (solver_choice) {
          case 0: my_solver= make_unique<cg_solver>(); break;
          case 1: my_solver= make_unique<bicg_solver>(); break;
        }
    
        (*my_solver)(A, b, x);
    }
    반응형

    댓글

    Designed by JB FACTORY