Необходимо смочь переопределить, Равняется на человеке, чтобы на самом деле сделать, Равняется на Person.id. Это должно привести к поведению, которое Вы после.
Вы не можете частично специализировать шаблоны функций, извините, но таковы правила. Вы можете сделать что-то вроде:
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);
. Возможно, вам придется немного повозиться с другом
кораблем или видимостью, если 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()
. В общем случае вам нужно будет иметь возможность устранять неоднозначность между различными перегрузками. В этом случае устранить неоднозначность легко, потому что пара шаблонов для двух типов, в то время как исходный член был шаблонен только для T.
Если вместо этого вам нужна была специализация, например, для std :: vector, то есть для контейнера с одним параметром шаблона, вы должны быть осторожны, так как компилятор может сбить с толку, если вы хотите создать экземпляр специализации шаблона, где шаблон T является std :: vector или специализацией для перегрузки,
template <T> std::<vector <T> foo::get() const
Предложенный вами синтаксис не может работать поскольку вы полностью специализируете функцию-член,
template <>
,
, но не учитываете два неопределенных типа, T1 и T2.