2015-01-26 3 views
-1

인터페이스가 일치하는 두 개의 콜렉션에 사용하고자하는 복잡한 함수가 있다면 (적어도 함수에 관한 것만 큼) 템플릿 코드를 다시 사용하는 방법이 있습니까?다른 인수에 대해 동일한 템플릿 함수를 사용합니까?

: I은 단부, 크기, 배열 및 벡터 모두 공통으로있는 다른 기능을 시작 사용할 경우

void DoSomethingIntense(std::vector<blah> myBlah); 
void DoSomethingIntense(std::array<blah> myBlah); 

그것을 입력 할 필요없이 DoSomethingIntense 본체를 다시 사용하는 방법이 두 번 (또는, 천국에 넣지 마시고 매크로에 채워 넣으시겠습니까?)

(예제 코드를 nitpick하지 않습니다, 그것은 도움이되지 않습니다 제발 사람)

UPDATE : 내 사과, 내가 문제의 기능이 서명과 일치하지 않는 클래스에 대한 다른 구현을 가지고 언급 무시; 모든 인수가이 두 가지에 대해 작동하는 코드를 사용하도록 만드는 것은 옵션이 아닙니다.

필자는이 시나리오에서 이터레이터 솔루션이 가장 좋다고 생각합니다.

+0

템플릿 기능이 꼭 필요한 기능이 아닙니까? 귀하의 질문에 명백한 대답이 포함되어 있기 때문에 혼란 스럽습니다 ... –

+0

이것은 템플릿 기능이 아니지만 반드시 있어야합니다. – tadman

답변

1

예, 사용하는 템플릿에서 그것을 얻을 수 있습니다

template<typename T> 
void DoSomethingIntense(const T &myBlah); 

편집 : 예

template<typename T> 
struct is_vector : std::false_type {}; 

template<typename T, typename A> 
struct is_vector<std::vector<T, A>> : std::true_type {}; 

template<typename T> 
struct is_array : std::false_type {}; 

template<typename T, size_t N> 
struct is_array<std::array<T, N>> : std::true_type {}; 

// add more if you want or define a macro 

template<typename T> 
std::enable_if_t<is_vector<T>::value || is_array<T>::value, void> 
DoSomethingIntense(const T &myBlah) 
{ 
} 

int main() 
{ 
    std::vector<int> v; 
    DoSomethingIntense(v); // OK 

    std::array<float, 5> a; 
    DoSomethingIntense(a); // OK 

    std::queue<int> q; 
    DoSomethingIntense(q); // ERROR 
} 
3

:

내가 바로 다음 업데이 트를 얻을 경우 내가 SFINEA의 메이크업 사용을 말할 것 , 템플릿을 사용하십시오.

template <typename Container> 
void DoSomethingIntense(Container blah) { // Might be better as Container const & 
    // write code using blah.begin() or whatever 
} 

당신은 컨테이너를 일반 반복자를 지원하는 범위보다는 구체적으로, STL의 예를 다음, 그것은 훨씬 더 일반적인 만들 수 있습니다

template <typename Iterator> 
void DoSomethingIntense(Iterator begin, Iterator end); 
0

당신은 템플릿/과부하를 혼합 할 수 있습니다. 문제 없어. 예를 들어

:

template <typename T> 
void DoSomethingIntense(T myBlah) { 

} 

void DoSomethingIntense(MyCustomClass myBlah) { 

} 

그런 다음이 인수 유형 MyCustomClass에 대한 템플릿이 아닌 버전과

또한 다른 것 (같은 vector 또는 array)의 템플릿 버전을 사용합니다, 당신은 std::enable_if을 사용할 수 있습니다 가능한 템플릿 인수의 범위를 제한합니다. this question을 참조하십시오.

관련 문제