문제

다음 멤버 기능을 전문화하고 싶습니다.

class foo {
    template<typename T>
    T get() const;
};

다른 수업에 bar 이는 템플릿에 따라 다릅니다.

예를 들어, 나는 원한다 bar 되려고 std::pair 일부 템플릿 매개 변수를 사용하여 다음과 같은 것입니다.

template<>
std::pair<T1,T2> foo::get() const
{
    T1 x=...;
    T2 y=...;
    return std::pair<T1,T2>(x,y);
}

여기서 T1과 T2도 템플릿입니다. 이 작업은 어떻게 할 수 있습니까? 내가 아는 한 가능해야합니다.

이제 전화 할 수 있습니다.

some_foo.get<std::pair<int,double> >();

전체/최종 답변 :

template<typename T> struct traits;
class foo {
    template<typename T>
    T get() const
    {
       return traits<T>::get(*this); 
    }
};

template<typename T>
struct traits {
    static T get(foo &f)
    {
        return f.get<T>();
    }
};

template<typename T1,typename T2>
struct traits<std::pair<T1,T2> > {
        static std::pair<T1,T2> get(foo &f)
        {
                T1 x=...;
                T2 y=...;
                return std::make_pair(x,y);
        }
};
도움이 되었습니까?

해결책

기능 템플릿을 부분적으로 전문화 할 수는 없지만 죄송합니다. 다음과 같은 작업을 수행 할 수 있습니다.

class foo {
   ...
};


template<typename T>
struct getter {
  static T get(const foo& some_foo);
};

template<typename T1, typename T2>
struct getter< std::pair<T1, T2> > {
static std::pair<T1, T2> get(const foo& some_foo) {
    T1 t1 = ...;
    T2 t2 = ...;
    return std::make_pair(t1, t2);
};

그런 다음처럼 부릅니다

getter<std::pair<int, double> >::get(some_foo);

그렇지만. 당신은 몇 가지 엉망이되어야 할 수도 있습니다 friend선박 또는 가시성 인 경우 get 실제로 회원 기능이 필요했습니다.

SBI의 제안에 대해 자세히 설명하기 위해 :

class foo {
   ...
   template<typename T>
   T get() const;
};

template<typename T>
T foo::get() const
{
  return getter<T>::get(*this);
  /*            ^-- specialization happens here */
}

그리고 이제 당신은 말할 수있는 것으로 돌아 왔습니다

std::pair<int,double> p = some_foo.get<std::pair<int, double> >();

다른 팁

당신은

template <T, V> std::pair<T, V> foo::get()

일반적인 경우 다양한 과부하 사이에 명확하게 변환 할 수 있어야합니다. 이 경우 쌍은 2 가지 유형으로 템플릿으로 표시되고 원래 멤버는 t에만 템플릿으로 표시되기 때문에 명확성이 쉽습니다.

대신에 STD :: VECTOR, 즉 단일 매개 변수 템플릿이있는 컨테이너를위한 전문 분야가 필요한 경우, 템플릿 전문화를 인스턴스화하려면 컴파일러가 혼동 될 수 있으므로 조심해야합니다. 템플릿 t가 std :: 벡터 또는 과부하의 전문화 인 경우

template <T> std::<vector <T> foo::get() const 

귀하의 제안 된 구문은 회원 기능을 완전히 전문화하기 때문에 작동 할 수 없습니다.

template <>,

그러나 당신은 두 가지 지정되지 않은 유형의 T1과 T2를 남기고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top