Явная специализация шаблона функции - PullRequest
0 голосов
/ 29 декабря 2010

Я думал, что специализации шаблона были полностью независимыми объектами и могли иметь все, что они хотели. Но VC ++ выдал мне ошибку, когда я сделал тип возврата специализации отличным от типа возврата исходного шаблона. Это действительно Стандарт? Я легко справился с этим, переместив тело функции в статический класс.

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Нет частичной специализации шаблона функции, потому что есть перегрузка функций (и шаблонов функций. Однако перегрузка функций гораздо более ограничена, чем специализация шаблона, поэтому вы обычно обращаетесь к специализациям шаблона класса:*

template< typename R, typename T >
struct foo_impl {
  static R foo(T)
  {
    // ...
    return R();   // blah
  }
};

template< typename T >
struct foo_impl<void,T> {
  static void foo(T)
  {
    // ...
  }
};

template< typename R, typename T >
R foo(T obj);
{
  return foo_impl<R,T>::foo(obj);  // fine even if R is void
}
0 голосов
/ 29 декабря 2010

Специализация функций странная и почти отсутствует. Можно полностью специализировать функцию, сохраняя при этом все типы - то есть вы предоставляете пользовательскую реализацию некоторой специализации существующей функции. Вы не можете частично специализировать шаблонную функцию.

Вполне вероятно, что то, что вы пытаетесь сделать, может быть достигнуто с помощью перегрузки, т.е.

template <typename T> T foo(T arg) { return T(); }
float foo(int arg) { return 1.f; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...