2016-06-02 2 views
0

C++ 11을 사용합니다. 다른 구성 파일을 한 줄씩 파싱하기 위해 Base 클래스와 파생 클래스가 여러 개 있습니다.CRTP 및 void 반환 메소드 *

template <class T> 
class Base 
{ 
public: 
    virtual ~Base(); 
    bool load_from_file(const QString& str); 
    virtual void* get_data(const QString& str) const = 0; 

private: 
    QList<QSharedPointer<T> > items_; 
}; 

각 자손 (class Derived: public Base<My_struct>)는 get_data() 구현을 제공해야합니다.
My_struct 인스턴스에는 설정 파일의 특정 행에 대한 정보가 들어 있습니다.

예를 들어, 프록시 목록이있는 일반 파일을 생각해보십시오.
My_struct 인스턴스는 load_from_file() 메서드의 Base 클래스에 스마트 포인터로 래핑되고 items_ 멤버에 추가됩니다. load_from_file() 메서드는 포장하기 전에 void* ~ T*을 캐스팅합니다.

void* (및 boost::any과 같은 라이브러리가없는) 클래스를 사용하지 않으려면 이러한 클래스를 다시 디자인 할 수 있습니까?
CRTP를 고려한다는 의미입니다. 보통 CRTP 예제는 void 반환 값 (파스칼의 프로 시저와 같은)을 가진 파생 클래스의 메서드를 포함합니다.

+0

'get_data'가 실제로 어떤 유형으로 반환하겠습니까? 'My_struct'? –

+1

CRTP는'Derived : public Base '입니다. 다른 구조체가 아닙니다. 그러면 함수는'T *'를 반환 할 수 있습니다. –

+0

@ MarkRansom, 파생 클래스 중 하나에서 My_struct *를 반환하고 싶습니다. – ilya

답변

1

브로! 힌트로 다음 코드를 C++ (14)로 전환하고 사용해보십시오 :

template <typename Derived> 
struct base 
{ 
template <typename T> 
auto f(T x) 
{ 
    return static_cast<Derived&>(*this).f_impl(x); 
} 

auto g() 
{ 
    return static_cast<Derived&>(*this).g_impl(); 
} 
}; 

struct derived : base<derived> 
{ 
bool f_impl(int x) 
{ 
    return true; 
} 

double g_impl() 
{ 
    return 4.2; 
} 
}; 

이 조각은 here에서 촬영되었습니다.