Специализация класса шаблона со значением по умолчанию для переменных и методов-членов - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть шаблон класса:

template<typename T>
struct DefaultPattern {
  using type = int;
  static int CalculateValue(const T& input) {
    return 0;
  }
};

Для каждого типа T у меня будет специализация. Проблема в том, что в классе специализации мне нужно определить все переменные-члены и методы, которые определены в DefaultPattern, даже если возможно, что они имеют то же значение, что и значение в DefaultPattern. Вот пример:

// A specialization for int.
template<>
struct DefaultPattern<int> {
  // Same as DefaultPattern but I need to define it again.
  using type = int;
  static int CalculateValue(const int& input) {
    return input + 2;
  }
};

Есть ли способ, чтобы, когда я делаю специализацию, мне нужно было только определить те члены, которые отличаются от DefaultPattern?

1 Ответ

0 голосов
/ 27 апреля 2018

Есть ли способ, чтобы при специализации мне нужно было определять только те элементы, которые отличаются от DefaultPattern?

Возможное решение - это своего рода наследование: ваша специализация может наследовать от общего шаблона. Обратите внимание, что для наследования от универсального шаблона в спецификации используется конкретный экземпляр (например, T = long используется ниже).

Например:

template <>
struct DefaultPattern<int> : public DefaultPattern<long>
 {
   static int CalculateValue (int const & input)
    { return input + 2; }
 };

То есть DefaultPattern<int> наследует type = int от DefaulPattern<long> (или DefaultPattern<std::string> или что-то еще) и переопределяет CalculateValue()

Ниже приведен полный рабочий пример:

#include <iostream>
#include <type_traits>

template <typename T>
struct DefaultPattern
 {
   using type = int;

   static int CalculateValue (T const &)
    { return 0; }
 };

template <>
struct DefaultPattern<int> : public DefaultPattern<long>
 {
   static int CalculateValue (int const & input)
    { return input + 2; }
 };

int main ()
 {
   static_assert( std::is_same<DefaultPattern<int>::type, int>{}, "!" );

   std::cout << DefaultPattern<long>::CalculateValue(1L) << std::endl;
   std::cout << DefaultPattern<int>::CalculateValue(1) << std::endl;
 }
...