Как специализировать только некоторые члены шаблонного класса?
Код:
template<class T>
struct A {
void f1() {};
void f2() {};
};
template<>
struct A<int> {
void f2() {};
};
int main() {
A<int> data;
data.f1();
data.f2();
};
ОШИБКА:
test.cpp: In function 'int main()':
test.cpp:16: error: 'struct A<int>' has no member named 'f1'
По сути, я хочу специализировать только одну функцию и использовать общее определение для других функций. (В реальном коде у меня много функций, которые я не хочу специализировать).
Как это сделать? Спасибо!
3 ответа
Рассмотрите возможность перемещения общих частей в базовый класс:
template <typename T>
struct ABase
{
void f1();
};
template <typename T>
struct A : ABase<T>
{
void f2();
}
template <>
struct A<int> : ABase<int>
{
void f2();
};
Вы даже можете переопределить f1
в производном классе. Если вы хотите сделать что-то более необычное (в том числе возможность звонить f2
от f1
код в базовом классе), посмотрите на CRTP.
Поможет ли это:
template<typename T>
struct A
{
void f1()
{
// generic implementation of f1
}
void f2()
{
// generic implementation of f2
}
};
template<>
void A<int>::f2()
{
// specific implementation of f2
}
Когда мы объявляем специализации для шаблонного класса, мы также должны определить все его члены, даже те, которые в точности равны универсальному шаблонному классу, потому что нет наследования членов от универсального шаблона к специализации. Итак, по вашей специализации вы должны реализовать void f1();
тоже.