шаблонная специализация шаблонного класса

Необходимо смочь переопределить, Равняется на человеке, чтобы на самом деле сделать, Равняется на Person.id. Это должно привести к поведению, которое Вы после.

7
задан Artyom 23 August 2009 в 13:24
поделиться

2 ответа

Вы не можете частично специализировать шаблоны функций, извините, но таковы правила. Вы можете сделать что-то вроде:

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> >();
8
ответ дан 7 December 2019 в 03:18
поделиться

Вам нужно перегрузить вашу функцию-член для пары, как в

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.

1
ответ дан 7 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: