2014-06-12 2 views
1

CRTP를 사용하여 초기화 참조를하는 방법이 있습니까?crtp를 사용하는 초기화 참조 멤버

내 목표는

#include <iostream> 

int gI = 1; 

template <typename Derived> 
struct A 
{ 
    A() 
    { 
     static_cast<Derived*>(this)->InitRefs(); 
    } 

    void InitInt(int & i) { i = gI; } 
}; 

struct B : public A<B> 
{ 
    B() : A<B>() {} 

    void InitRefs() 
    { 
     InitInt(i); 
    } 

    int & i; 
}; 

int main() 
{ 
    B b; 
    std::cout << b.i; 
} 

답변

3

참조 구성원이 MEM-초기화 목록 초기화해야하며 (모든 참조처럼) 다시 장착 할 수없는 일을 다음과 같은 코드를 확인하는 것입니다.

당신이, 참조 멤버 이니셜 라이저를 제공 int에 좌변의 참조를 반환하는 멤버 함수 공급 고려해야 할 기본 클래스 템플릿을 원하는 경우 :

template <typename Derived> 
struct A { 
    int& InitInt() { return gI; } 
}; 

struct B : public A<B> { 
    B() : A<B>(), i(InitInt()) {} 
    int & i; 
}; 

을 그렇지 않으면, 당신은 현재 디자인에 최선을 다하고 경우를 사용하는 것을 고려 제한된 방법으로 참조처럼 동작하고 다시 장착 할 수 std::reference_wrapper<int> : 당신은 DERI로, 기본 클래스 생성자에서 InitRefs를 호출 할 수 없습니다

template <typename Derived> 
struct A { 
    A() {} 
    void InitInt(std::reference_wrapper<int> & i) { i = gI; } 
}; 

struct B : public A<B> { 
    B() : A<B>() { InitRefs(); } 
    void InitRefs() { InitInt(i); } 
    std::reference_wrapper<int> i; 
}; 

주 ved 클래스 객체는 생성자 본문이 입력 될 때까지 존재하지 않습니다.