Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Шаблонные классы. Явные специализации
Шаблонные классы могут иметь перегруженные версии, в которых тип данных указывается явным образом. Объявление явной специализации выглядит так:
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;
}
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов