2016-06-19 3 views
1

함수 포인터 테이블을 초기화하는 코드는 다음과 같습니다. 이 테이블은 입력 파일이 구문 분석 될 때 사용됩니다.템플릿 클래스의 정적 메서드에 대한 함수 포인터

class TorchModule { ... }; 
class TorchLinear : public TorchModule { ... }; 
class TorchView : public TorchModule { ... }; 
... 
typedef std::shared_ptr<const TorchModule> (*load_function)(File* file); 

using table_type = std::map< std::string, load_function > table_type; 

table_type load_Object = { 
    {"nn.Linear", &TorchLinear::load }, 
    {"nn.View" , &TorchView ::load } 
}; 

기본 클래스 TorchModule이 템플릿 클래스 인 경우 어떻게 코드를 업데이트 할 수 있습니까?

template<MODE mode> 
class TorchModule { ... }; 
template<MODE mode> 
class TorchLinear : public TorchModule<mode> { ... }; 
template<MODE mode> 
class TorchView : public TorchModule<mode> { ... }; 
+1

뭘 원하는지 확실하지 않습니다. 'TorchModule'이 그 서브 클래스에 어떻게 영향을 미치는가? 어디에서 템플릿 매개 변수'mode'가 사용됩니까? [mcve] –

+0

을 제공하십시오. 아직 ** 완전한 ** 예가 아닙니다. 어디에서'load_Object'가 저장되고 있습니까? 이 변수는 전역 변수입니까? 또는 다른 유형의 회원입니까? 초기화되는 위치는 어디입니까? ... 현재 구현에서이 맵을 사용하는 방법을 보여줍니다. –

답변

2

테이블을 템플릿 클래스에서 정적 변수로 정의 할 수 있습니다.

template<MODE mode> 
using load_function = std::shared_ptr< const TorchModule<mode> > (*)(File* file); 

template<MODE mode> 
using table_type = std::map< std::string, load_function<mode> >; 

template<MODE mode> 
struct Table { 
    static table_type<mode> table; 
}; 

template<MODE mode> 
table_type<mode> Table<mode>::table = { 
    {"nn.Linear", &TorchLinear<mode>::load }, 
    {"nn.View" , &TorchView<mode> ::load } 
}; 

참고 :

  • 나는 C++ (11) 템플릿 별칭 (사용) 사용. C++ 98의 경우 typedef를 템플릿 클래스에 넣을 수 있습니다.
  • 함께 사용되는 모든 다른 모드에 대해 하나의 표 인스턴스가 있습니다.
  • C++ 14를 사용하면 클래스에서 테이블을 정의하는 대신 템플릿 변수를 사용할 수 있습니다.
  • 모드를 기준으로 클래스에 클래스를 넣으면 솔루션의 모든 부분에 템플릿 매개 변수가 전달되지 않으므로 코드를 더 읽기 쉽게 만들 수 있습니다.
+0

템플리트 화 된'TorchModule' 안에'template' 및'typename' 키워드를 사용할 필요가있을 수도 있습니다 (관련 : http://stackoverflow.com)./questions/610245/where-and-why-do-do-do-do-the-template-and-typename- 키워드) –

관련 문제