2010-03-29 8 views
4

나는이 같은 템플릿 기능이 상상 :C++ - typedef "inside"템플릿 인수?

template<typename Iterator> 
void myfunc(Iterator a, typename Iterator::value_type b) 
{ ... } 

반복자에 대한 형식 정의 :: 치형 내가 함수 서명에 사용할 수있는 같은 일을 구현하여 선언하는 방법이 있나요? 지금까지 내가 기본 템플릿 인수를 사용하고 기본을 확인하려면 개념 향상에 의지 한

template< 
    typename Iterator, 
    typedef Iterator::value_type type> 
void myfunc(Iterator a, type b) 
{ ... } 

항상 사용됩니다 :

예를 들어, 나는 이런 식으로 뭔가를 할 수 있기를 원합니다
template< 
    typename Iterator, 
    typename type = typename Iterator::value_type > 
void myfunc(Iterator a, type b) 
{ 
    BOOST_STATIC_ASSERT((
     boost::is_same< 
      typename Iterator::value_type, 
      type 
     >::value 
    )); 
    ... 
} 

...하지만 이런 유형의 언어에 대한 지원이 있다면 좋을 것입니다.

기본 인수 기능에 대한 표준 아니기 때문에 아마, 함수 대신 클래스를 이용해야

편집.

template< 
    typename T, 
    typename V = typename T::value_type> 
class A : public B<T, V> 
{ 
    BOOST_STATIC_ASSERT((boost::is_same<typename T::value_Type, V>::type)); 
}; 
+0

참고 : 함수 템플릿의 기본 템플릿 인수는 확장입니다. 그들은 C++ 03에 있지 않습니다. –

+0

다른 곳에서도 typename을 생략했습니다. 네가 괜찮 으면 좋겠다. –

답변

2

는 템플릿 함수 정의 내에서 사용 할 수 있습니다. 나는

당신은 & 구조체에는 정적 기능이있는 템플릿 클래스를 가질 수 있습니다 ... 당신이 할 수 있다고 생각 ...하지만 그것을 사용하는 것은 추한 도착하지 않습니다 개인적으로

template<typename Iterator> 
class arbitraryname 
{ 
public: 
    typedef typename Iterator::value_type value; 

    static void myfunc(Iterator a, value b) 
    { 
    value c = b; 
    cout << "Test" << c << endl;  
    } 
}; 

struct Foo 
{ 
    typedef int value_type; 
}; 

int main() 
{ 
    Foo f; 
    myfunc<Foo>(f,2); // Old way. 
    arbitraryname<Foo>::myfunc(f,3); // With templated class. 
} 

,이 경우, 나는 #DEFINE 년대는 추한 죄인

#define VALUE_TYPE typename Iterator::value_type 
template<typename Iterator> 
void myfunc(Iterator a, VALUE_TYPE b) 
#undef VALUE_TYPE 
{ 
    typedef typename Iterator::value_type bar; 
    bar z = b; 
    cout << "Test" << z << endl; 
} 

물론 ... #DEFINE와 함께 갈 것입니다. 하지만 코드가 아프지 만 읽기가 어렵습니다.

p.s. 안전을 위해 다음을 추가 할 수 있습니다.

#ifdef VALUE_TYPE 
#error "VALUE_TYPE already defined!" 
#endif 
2

당신은 매개 변수 목록에서 typename을 사용할 수 있습니다 : 당신은 템플릿 형식 정의를 찾고 있습니다

template <typename Iterator> 
void myfunc(Iterator a, typename Iterator::value_type b) 
{ 
} 
+0

오, 누락 된 typename 내 예를 들어, 버그를 잡기위한 감사합니다. 그러나 그것은 내가 대답하려고하는 질문이 아닙니다. 내가 진정으로 원하는 것은 b에 대한 typedef를 사용하여 함수 시그너처를 덜 상세하게 만드는 것입니다. –

+0

@redmoskito : 나는 당신이 성취하고자하는 것을 이해하고 있는지 확신하지 못합니다. 두 번째 코드 조각은 첫 번째 코드 조각보다 길고 세 번째 코드 조각은 비교적 거대합니다. 전적으로 자만심을 보면서, 첫 번째 옵션이 최선의 선택입니다. 내가 아는 한 최선의 방법이기도합니다. C++ 0x에서 허용되는 반면 C++ 03에서는 유효하지 않은 클래스 템플릿 만 C++ 03의 기본 템플릿 인수를 가질 수 있지만 두 번째 코드 단편과 세 번째 코드 단편에서 보여주는 것을 성취 할 방법이 없습니다. –

+0

당신은 좀더 자세한 정보를 표시하지 않을 수도 있지만, IMO는 함수의 시그니처에서 반복자에 대한 명시적인 타입을 없애는 것은 단지 '타입'보다 나은 것을 선택하지 않는 한 명확하지 않게됩니다. – hhafez