2016-12-01 3 views
5

동일한 비즈니스 방법을 구현하는 클래스 집합이 있습니다. 성능상의 이유로 가상 디스패치 대신 CRTP를 사용할 계획입니다. 하지만 상속 및 가상 메서드와 함께 제공되는 단일 인터페이스로 코딩의 편의성을 유지하고 싶습니다.인터페이스와 CRTP 사용

일반화 된 클래스를 상속하는 일반 템플릿을 사용하는 템플릿 기반 추상 클래스와 클라이언트 가상 코드를 상속 받아 모든 유형의 인스턴스를 만들 수 있지만 내 클라이언트 코드를 가질 수는 있습니다. 인터페이스에만 의존 하는가? CRTP를 사용하여 클라이언트 코드에 단일 인터페이스를 제공하는 동시에 여러 구현을 수행하는 방법은 무엇입니까?

+0

: 당신은 완벽하게 유효이 같은 방법을 사용할 수 있습니다 왜 그것의 일반적인 대체 이름은 정적 다형성입니다. 물론 통사론적인 관점에서 아무도 당신이 이것을하는 걸 막을 수는 없지만, IMHO를 통해 그것을 생각할 필요가 있습니다. –

+0

public 메소드는 인터페이스에 없을 것입니다 전문 분야. – ruipacheco

답변

5

확실히. 당신은 성능 문제로 인해 코드를 리팩토링하려는 경우 추상적 인 방법은 당신이 가상 파견을 피하기 위해 CRTP를 사용하여 ... 좋은 생각이 아니다 잘

class Interface 
{ 
public: 
    virtual void doSomething() = 0; 
    //... 
}; 

template<typename T> 
class GeneralImpl : public Interface 
{ 
public: 

    void doSomething() override 
    { 
     auto someDetail = T::somethingStatic(); 
     //... 
     static_cast<T*>(this)->someMember(); 
     //... 
    } 
} 

class SpecificImpl : public GeneralImpl<SpecificImpl> 
{ 
public: 
    static int somethingStatic() 
    { 
     //... 
    } 

    void someMember() 
    { 
     //... 
    } 
}; 

int main() 
{ 
    std::vector<Interface*> vec; 
    SpecificImpl instance; 

    //... 

    vec.push_back(&instance); 

    //... 

    for(auto* inst : vec) { 
     inst->doSomething(); 
    } 

    //... 
} 
+0

런타임 비용은 순수 가상 함수 만 사용하는 것과 같을까요? – ruipacheco

+0

예, 템플릿에 런타임 오버 헤드가 전혀 없기 때문입니다. – Smeeheey

+0

그래서이 코드를 보면 CRTP는 순수 가상 함수만을 사용하는 것과 비교할 때별로 도움이되지 않을 것입니다. 나는 동일한 성능 패널티를 가지고 있는가? – ruipacheco