2010-01-15 7 views
1

:템플릿 공제 및 기능 포인터

class Base 
{ 
protected: 
    typedef View * ViewType; 
    typedef boost::function<ViewType()> ActionType; 
    typedef boost::unordered_map<std::string, ActionType> ActionMapType; 

    ActionMapType actions; 

    template <class ControllerType> 
    inline void addAction(std::string actionName, ViewType (ControllerType::*action)()) { actions.insert(ActionMapType::value_type(actionName, bind<ViewType>(&action, static_cast<ControllerType *>(this)))); } 
}; 

class Derived : public Base 
{ 
    Derived() 
    { 
     addAction("someAction", &Derived::foo); // No template 
    } 

    ViewType foo() { cout << "foo"; } 
} 

내가 ControllerType으로 파생 지나가는 오전 알고 있지만, 어떻게 컴파일러가 파생 것을 확실히 알 수있는 템플릿입니다 매개 변수? 당신이 addAction() 함수 호출에 &Derived::foo 지정 (그리고, 말, &SomethingElse::foo) 때문에이 Derived 알고

답변

2

템플릿 매개 변수는 이며이 매개 변수는 함수 매개 변수 목록에서 ViewType (ControllerType::*action)() 매개 변수로 사용됩니다. ViewType (Derived::*)() 유형의 실제 인수를 제공하면 컴파일러는 즉시 ControllerType = Derived을 인식합니다. 그게 전부 야. 이를 템플릿 인수 공제라고합니다.

C++의 일부 컨텍스트에서는 컴파일러가 함수 인수의 형식에서 템플릿 인수를 추론 할 수 없습니다. 이러한 컨텍스트는 의 추론되지 않은 컨텍스트이라고합니다. 언어 사양은 추론되지 않은 컨텍스트 목록을 제공합니다. 그리고 당신들도 그 중 하나가 아닙니다.

+0

나는 이미 가지고있다. 그 일이 왜 일어 났는지 묻고있었습니다. Bruce의 답변을 참조하십시오. –

+0

당신은 템플릿 인수 공제가 어떻게 작동하는지 알지만 템플릿 인자 공제가 있는지 모릅니다. – AnT

+0

템플릿 차감이 발생할 수 있음을 알고 있었지만, 실제로 알지 못했습니다. 그것이 작동했을 때 함수 포인터와 관련이 있다고 생각했지만 확실하지 않았습니다. 또한 나는 템플릿 인자 공제가 존재한다는 것을 몰랐다. –

0

템플릿 매개 변수입니다. 이것은 컴파일 타임에 결정되므로 RTTI는 필요하지 않습니다.

1

함수 템플릿은 형식을 추론합니다.

ViewType (ControllerType::*action)()입니다. 여기에서 ControllerType은 모든 클래스가 될 수 있습니다. 따라서 기본적으로 아무 것도 취하지 않고 ViewType을 반환하는 클래스 함수에 대한 포인터를 찾고 클래스는 모든 클래스가 될 수 있습니다. '모든 유형'은 Derived이어야합니다.

관련 문제