Шаблонная специализация и наследование

Предположим, у меня есть шаблонный класс с большим количеством функций, и я хочу специализировать их, чтобы изменить только некоторые из них и сохранить остальные точно так, как указано в базовом шаблонном классе.

Как я могу это сделать?

Вот то, чего я хочу достичь, но решение неЭто хорошо, потому что это не позволяет мне ссылаться на специализацию дляint какBase - Мне нужно использоватьIntSpec для этого.

#include 

using namespace std;

template
struct Base
{
  void print1() {cout < "Base::print1" < endl;};
  void print2() {cout < "Base::print2" < endl;};
};

struct IntSpec : public Base

Ответы на вопрос(3)

Решение Вопроса

template<typename t="">
struct Base
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

template<>
void Base<int>::print2() {cout << "Base<int>::print2()" << endl;};
</int></int></typename>

Таким образом, вы можете специализировать только определенные функции-члены и при этом использовать те, которые у вас нет.специализированный (в данном случаеprint1) без каких-либо проблем. Так что теперь тыбуду использовать его так, как вы хотели:

Base<int> i;
i.print1();
i.print2(); // calls your specialization
</int>

демонстрацияВот.

 Christian Rau12 июн. 2013 г., 09:49
@NicolBolas Я для себя всегда думал, что это совершенно справедливо (и удивлялся, почему это не такт ответ сразу), но это нене должно что-то значить (хотя, я думаю, что я помнил, что когда-то явно искал это вVandevoorde-Josuttisи нашел его).
 Nicol Bolas12 июн. 2013 г., 05:43
Вы уверены, чтостандарт C ++ или расширение компилятора?
 mfontanini12 июн. 2013 г., 14:29
@NicolBolas Я верю §14.7.3 / 14 позволяет это сделать. Я ошибся?

чтобы добавить уровень косвенности в функцию, которую вы хотите переопределить, т.е.

template<typename t="">
struct foo
{
    template<typename t2="">
    void bar_impl()
    {
        //generic function
    }

    void bar()
    {
        bar_impl<t>();
    }
};
</t></typename></typename>

Затем вы можете специализировать каждую функцию индивидуально для каждого типа или специализировать весь тип по желанию.

template<typename t="">
struct CommonBase
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

template<typename t="">
struct Base : public CommonBase<t>
{
};

template<>
struct Base<int> : public CommonBase<int>
{
  void print2() {cout << "Base::print2" << endl;};
};
</int></int></t></typename></typename>

Вы всегда используетеBase, скорее, чем .CommonBase

Ваш ответ на вопрос