템플릿 클래스의 템플릿 전문화
-
19-09-2019 - |
문제
다음 멤버 기능을 전문화하고 싶습니다.
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를 남기고 있습니다.