2012-08-17 2 views
1

CRTP 솔루션을 작동시키기 위해 누락 된 회선을 무엇으로 대체해야합니까?CRTP : 파생 클래스에 대한 참조를 반환합니까?

template<class Crtp> class Base 
{ 
    public: 
     inline Crtp& operator=(const Base<Crtp>& rhs) 
     { 
      for (unsigned int i = 0; i < const_size; ++i) { 
       _data[i] = rhs._data[i]; 
      } 
      return /* SOMETHING HERE BUT WHAT ? */ 
     } 

    protected: 
     static const unsigned int const_size = 10; 
     double _data[const_size]; 
}; 

class Derived : public Base<Derived> 
{ 
}; 

다른 질문 : 당신이 제공 할 솔루션 (운영자가 직접 파생 클래스에서 구현되는 솔루션에 비해) 실행 시간에 비용이 무엇입니까?

대단히 감사합니다.

+0

단순히 'static_cast'입니까? – Xeo

답변

1
return static_cast<Crtp&>(*this); 

이 런타임에 아무런 비용이 없습니다 (하지만 당신은 Base의 생성자를 보호 할 수 있습니다).

+0

"* static_cast (this)"과 차이가 있습니까? (나는 시도하지 않았다)? + Base에 public 생성자가 있다는 사실은 런타임에 솔루션에 비용이 들지 않는다는 사실을 변경할 수 있습니까 (아니면 Base가 추상 클래스로 사용되는지 확인하기위한 것일뿐)? – Vincent

+0

@Vincent, 적어도 차이는 있지만 실제로는 최소한입니다. 두 번째 질문 : 후자. –

+0

@Vincent, 포인터가 아닌 참조를 반환하기 때문에 캐스트가 참조가되어야합니다. 그리고 참조는 새로운 객체를 생성하지 않기 때문에 생성자는 그 객체와 아무 상관이 없습니다. –

관련 문제