Как переопределить функцию в шаблоне с++?

76
02 июня 2021, 02:40
template<class T>
class Tree{
****
public:
****
void show();
}
-----
class SomeClass{
***
public:
void show(){
 cout << 5;
}
}
-------
int main(){
Tree<SomeClass> t;
t.show();
}

Собственно, имеется шаблонный класс tree. Есть еще класс SomeClass, в котором есть метод show. Создается дерево объектов SomeClass. И нужно его вывести. Как это сделать?

Проблема в том, что таких SomeCLass будет несколько штук, я хочу в каждом определить свой метод show И чтобы когда я обращался к Tree< SomeClass1 >.show() вызывался свой show, для Tree< SomeClass2 >.show() - свой

Answer 1

Нужно просто написать эти специализации функции:

template<class T>
class Tree {    
public:
    //данный метод является селектором (просто выполняет вывод)
    //поэтому нужно обьявлять с const
    void show() const;
};

class SomeClass1 {  
public:
    void show() const { std::cout << 1; }
};
class SomeClass2 {  
public:
    void show() const { std::cout << 5; }
};
template<> void Tree<SomeClass1>::show() const
{
    SomeClass1().show();
}
template<> void Tree<SomeClass2>::show() const
{
    SomeClass2().show();
}
//для остальных также
//и общее определение
template <class T>
void Tree<T>::show() const
{
   std::cerr << std::endl
             << "other specializations"; 
}
int main() {    
    Tree<SomeClass1> t1;
    Tree<SomeClass2> t2;
    t1.show();
    t2.show();
    Tree<int> t;
    t.show();
    return 0;
}

Можно написать и одно определение:

template<class T> void Tree<T>::show() const
{
    T().show();
}

Но такое определение неразумное, так как не каждый тип имеет такой метод

Answer 2

Возможно вам нужен виртуальный метод с полиморфизмом

class Tree {
public:
    virtual void show()
    {
        cout << "test 1" << endl;
    }
};
class SomeClass :public Tree {
public:
    void show() override
    {
        cout << "test 2" << endl;
    }
};
int main()
{
    Tree show;
    SomeClass base;
    Tree *weapon = &base; // &show Полиморфизм
    weapon->show();
}
READ ALSO
ReadFile теряет данные

ReadFile теряет данные

Есть программно-аппаратный комплекс, состоит из внешнего устройства и ПК с управляющей программойСвязь между устройством и ПК осуществляется...

119
Как убрать анимацию?

Как убрать анимацию?

Здравствуйте, как избавиться от анимации?

91
Iframe emded не загружается на маленьком разрешении

Iframe emded не загружается на маленьком разрешении

На сайте используется следующий код:

77
Растянуть несколько div в div 100% css

Растянуть несколько div в div 100% css

Подскажите пожалуйста, как растянуть дочерние div в родительском div который имеет width: 100%;Таблица не подходит

106