2016-07-10 4 views
0

바이너리 크기를 줄이기 위해 템플릿 메서드 내에서 일부 코드를 비 템플릿 메서드로 이동하려고합니다.템플릿이 아닌 방법에 인수로 템플릿 매개 변수를 사용할 수 있습니까?

template<TargetType K, typename V = plat_target_handle_t> 
class Target 
{ 
    ............. 
    .............. 
}; 

은 TargetType 아래 그림과 같이 '대상'이라고하는 템플릿 클래스는 열거 데이터 형식이된다.

template<> 
template< TargetType T> 
std::vector<Target<T> > 
Target<TARGET_TYPE_X>::getChildren(const TargetState i_state) const 
{ 
    std::vector<Target<T> > l_children; 
    for (int i=0; i < elements_in_some_list ; ++i) 
    { 
     /*If the current entry in some_list match my critera, add to the l_children */ 
    } 
} 

TargetType은 열거 형 데이터 유형이고 TARGET_TYPE_X는 열거 형 값 중 하나입니다.

저는 모든 로직을 전역 메소드로 선택하도록하고 싶습니다. getChildrenHelper라고 말하면됩니다.

getChildrenHelper는 다음과 같이 선언됩니다.

void getGhildrenHelper(const TargetType i_targetType, 
     const TargetState i_targetstate, 
    std::vector<Target<TARGET_TYPE_ALL>> & io_children); 

그리고 다음 getChildren 방법은 결국

template<> 
template< TargetType T> 
std::vector<Target<T> > 
Target<TARGET_TYPE_X>::getChildren(const TargetState i_state) const 
{ 
    std::vector<Target<T> > l_children; 
    childHelper(T,i_state,l_children); 

    return l_children; 
} 

내 생각과 같을 것이다 내가 함께 일하고 네이티브 컴파일러가 오류를하지 않았지만이, 할 수없는 것입니다.

그러나 유사한 개념이 완벽하게 잘 작동하는 다른 기존의 코드가

template< TargetType K > 
inline ReturnCode putParam(const Target<K>& i_target, 
const RingID i_ringID, 
const RingMode i_ringMode) 
{ 
ReturnCode l_rc = FAPI2_RC_SUCCESS; 

// Find the string in the SEEPROM 
l_rc = findInImageAndApply(i_target, i_ringID, i_ringMode); 

return l_rc; 
} 


fapi2::ReturnCode findImageAndApply(
    const fapi2::Target<fapi2::TARGET_TYPE_ALL>& i_target, 
    const RingID i_ringID, 
    const fapi2::RingMode i_ringMode) 
{ 
................ 
................ 
} 
+0

리팩터링하려는 예제 프로그램은 컴파일되지 않습니다. 'TargetType','TARGET_TYPE_X','TargetState' 및'plat_target_handle_t'의 정의가 없습니다. – user2079303

+0

TargetType과 TargetState는 enum입니다. plat_target_handle_t는 다른 곳에서 정의 된 것과 비슷하게 정교하지 않습니다. –

답변

1

템플릿 함수는 코드의 큰 덩어리를 실행하기 위해 일반 비 템플릿 함수를 호출하기에 매우 일반적입니다 템플릿 매개 변수가 필요 없거나 사용하지 않습니다. 이것은 템플릿 생성 코드가 부풀어 오르는 것을 피하기위한 공통 기술입니다.

고객님의 경우 TargetType이 (가) 템플릿 매개 변수로 표시되며 해당 클래스가 없습니다. 예를 들면 : TargetType는 템플릿 전문의 코드를 기반으로 템플릿 매개 변수, 그리고 클래스의 이름으로 나타납니다 이후

void getGhildrenHelper(const TargetType i_targetType, 
     const TargetState i_targetstate, 
    std::vector<Target<TARGET_TYPE_ALL>> & io_children); 

자체 즉, 컴파일해서는 안된다.

하지만 코드가 모호 할 수 있습니다. 어쨌든 TargetTypeTargetState 또는 Target<TARGET_TYPE_ALL>이 템플릿 매개 변수가 아니면 일반 함수가되며 템플릿 매개 변수에서 일치 매개 변수를 사용하여 확실히 호출 할 수 있습니다.

템플릿 함수는 다른 함수를 호출하거나 다른 템플릿을 사용하여 일반 함수가 수행하는 모든 작업을 수행 할 수 있습니다. 요구 사항은 다른 함수와 같습니다. 일치하는 함수 매개 변수 유형 등 ...

+0

Sam, 답변 주셔서 감사합니다. 그러나 '템플릿 매개 변수가 아닌 클래스 이름'이 무슨 뜻입니까? pls 할 수 있습니까? 그것에 정교하게? –

+0

이 질문에 직접 대답 할 수 있습니다 :'TargetType'은 템플릿 매개 변수입니까, 아니면 실제 클래스의 이름입니까? –

+0

아 .. 이전에 오해 한 것 같아요, 템플릿 매개 변수입니다. –

관련 문제