Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Специализация метода шаблона класса С++

#cpp #методы #шаблоны_с++


У меня есть шаблон класса. Я захотел добавить метод, но только для одного конкретного
типа. При использовании частичной специализации, по сути, нужно переписывать все поля
и методы, даже если я их не изменяю. В итоге, при изменении чего-то общего, приходиться
менять код в 2 местах.
Подскажите, есть ли какой-то другой способ реализации такого специального метода
или как избежать такого неудобства?

UPD: С методом разобрался, спасибо. Но возникает вопрос, как тогда действовать, если
нужно добавить атрибут?
    


Ответы

Ответ 1



Если у вас есть шаблон класса, то его методы являются независимыми шаблонами и специализировать их можно независимо. Т.е. для этого не надо специализировать весь класс заново template struct 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.

Комментариев нет:

Отправить комментарий