2011-03-26 2 views
1

저는 게임 프로그래밍을 가르쳐 왔으며 새로운 경우 이전 코드를 변경해서는 안된다는 목표로 의존성을 깨는 데 많은 시간을 할애했습니다. 코드가 도입되었습니다. 우리는 렌더러 객체를 설정하고 렌더링 클래스를 템플릿 화하기로 결정하여 특성 클래스 등을 사용하는 방법을 보여줄 수있었습니다.하지만 이것은 흥미로운 아이디어로 이어졌습니다.이 템플릿 디자인 아이디어에 대한 의견을 듣고 싶습니다.

전체 본문을 제공하지 않고 전체 전문화 만 제공하는 경우 렌더링 클래스를 외부 코드에서 렌더링 할 수있는 것과 관련하여 확장 할 수 있으며 전체 전문화 기능이없는 객체가 렌더링되는 경우 컴파일러가 exe. 따라서이 시스템을 사용하는 게임은 렌더러 hpp 또는 cpp 파일을 변경하지 않고도 사용자 정의 렌더링 가능 객체를 작성하고 기능을 확장 할 수 있습니다.

이것은 알려진 디자인 패턴입니까? 아니면 끔찍한 생각입니까? 왜 다른 사람이이 작업을 했습니까? 나는 내가보기에 모든 것이 긍정적이기 때문에 여기에 심각한 문제가 있는지 알고 싶다.

감사합니다.

다음은 공식화 된 코드입니다.

나는 클라이언트 코드가 템플릿인지 모르기 때문에 조금 다르게하고 있습니다. 내가 제대로 설명을 이해하고있어 경우

class Renderer 
{ 
public: 
    void SwapBuffers(); 

    template<typename RenderObj> 
    void Render(const RenderObj&); 
}; 

// Full specializations 
class Sprite; 
template<> void Renderer::Render<Sprite>(const Sprite&); 
+3

당신은 아마 당신이 할 수있는 몇 가지 "개념 증명"코드가 있습니까 : (이론적으로 할 수 있지만) 클라이언트는 일반적으로 전문화를 제공하지 않지만 표준은 :: C++ 11의 기능은 비슷한 패턴을 따른다 몫? 내가 볼 수없는 디자인에 대해서는 언급 할 수 없다. –

답변

1

는 :

template <class> class render; // undefined 

template <> 
class render<Object1> 
{ 
    // ... 
}; 

template <> 
class render<Object2> 
{ 
    // ... 
}; 

// ... 

을 나는이 유효한 접근 방법을 고려. 경우에 따라 일반 사례 기본 템플릿을 작성할 수 있으며 경우에 따라 템플릿을 작성할 수도 없습니다. 그리고 컴파일 타임 오류는 런타임 오류보다 뛰어날 수 없다는 것을 나타냅니다 (말한대로).

나는 이름을 붙일 수는 없지만 디자인 패턴이 알려졌다.

template <class> class function; // undefined 

template<class R, class... ArgTypes> 
class function<R(ArgTypes...)> 
{ 
    // ... 
}; 
+0

클라이언트 코드가 템플릿인지 모르기 때문에 조금 다르게 설명합니다. 클래스 렌더러 { public : \t void SwapBuffers(); \t 템플릿 \t void 렌더링 (const RenderObj &); }; // 전체 전문 클래스 스프라이트; 템플릿 <> void Renderer :: Render (const Sprite &); – Tavison

관련 문제