Шаблонные классы. Явные специализации

Шаблонные классы могут иметь перегруженные версии, в которых тип данных указывается явным образом. Объявление явной специализации выглядит так:

template<>
class Название_класса<Тип1[, ..., ТипN]> {
   // Тело класса
};

Например, в предыдущем примере, если объект создать следующим образом:

C<int, double> a(10, 12.5);

то будет выведено предупреждающее сообщение об усечении значения, так как внутри метода sum() результат сложения будет иметь тип double, а возвращаемый результат должен иметь тип int. Чтобы этого избежать можно реализовать явную специализацию для этой последовательности типов (листинг 15.2) или реализовать метод sum() следующим образом:

auto sum() -> decltype(x_ + y_) {
   return x_ + y_;
}

Листинг 15.2. Явная специализация класса

#include <iostream>

template<typename T1, typename T2>
class C {
   T1 x_;
   T2 y_;
public:
   C(T1 x, T2 y) { x_ = x; y_ = y; }
   T1 sum() { return x_ + y_; }
};

template<>
class C<int, double> {
   int x_;
   double y_;
public:
   C(int x, double y) { x_ = x; y_ = y; }
   double sum() { return x_ + y_; }
};

int main() {
   C<int, double> a(10, 12.5);
   std::cout << "sum = " << a.sum() << std::endl;
   C<double, int> b(12.5, 10);
   std::cout << "sum = " << b.sum() << std::endl;
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов