#cpp #методы #шаблоны_с++
У меня есть шаблон класса. Я захотел добавить метод, но только для одного конкретного типа. При использовании частичной специализации, по сути, нужно переписывать все поля и методы, даже если я их не изменяю. В итоге, при изменении чего-то общего, приходиться менять код в 2 местах. Подскажите, есть ли какой-то другой способ реализации такого специального метода или как избежать такого неудобства? UPD: С методом разобрался, спасибо. Но возникает вопрос, как тогда действовать, если нужно добавить атрибут?
Ответы
Ответ 1
Если у вас есть шаблон класса, то его методы являются независимыми шаблонами и специализировать их можно независимо. Т.е. для этого не надо специализировать весь класс заново templatestruct Class { int i; void foo() { i = 5; std::cout << "Generic implementation" << std::endl; } }; template <> void Class ::foo() { i = 42; std::cout << "Specialized implementation" << std::endl; } int main() { Class d; d.foo(); std::cout << d.i << std::endl; Class i; i.foo(); std::cout << i.i << std::endl; } Однако добавить метод, которого изначального нет в основном шаблоне таким способом не получится. Если вам нужно именно добавить метод, то возможно имеет смысл объявить этот метод в главном шаблоне (не определяя его, или определив его как deleted), а потом уже предоставлять специализации вышеописанным способом. Ответ 2
GCC компилирует следующий код: #include#include using namespace std; template struct A { A(T x) : x(x) {} void foo() = delete; // { cout << "default: " << x << endl; } void bar() { cout << "bar: " << x << endl; } T x; }; template<> void A ::foo() { cout << "int: " << x << endl; } int main() { A a(0); a.foo(); a.bar(); A b(0); // b.foo(); // - не компилируется b.bar(); A c("hello"); // c.foo(); // - не компилируется c.bar(); return 0; } Собственно, если заменить = delete, на закомментированный код, все будет работать, как в ответе AnT.
Комментариев нет:
Отправить комментарий