Re[2]: Шаблонная виртуальная ыункция
От: Ventalf Россия  
Дата: 27.02.13 09:50
Оценка:
Здравствуйте, Ventalf, Вы писали:

V> > Здравствуйте коллеги, знаю что нельзя явно определить шаблонную функцию виртуальной

V> > ...
V> > В моем примере естественно происходит вызов методов класса A, но можно ли как то "перегрузить", что бы через указатель базового классы вызывался шаблонный метод потомка?

V> Можно сделать так (предполагает наличие в сете типа value_type, константы кастятся в ключи статически):


Или даже так:

#include <iostream>
#include <boost/unordered_set.hpp>

class AbstractSetHolder
{
public:
    virtual void insert(int key) const = 0;
    virtual ~AbstractSetHolder() {}
};

template <class _TMemSet> class SetHolderImpl : public AbstractSetHolder
{
public:
    SetHolderImpl(_TMemSet &set) : set_(set)
    {}
    virtual void insert(int key) const
    {
        set_.insert(static_cast<typename _TMemSet::value_type>(key));
    }
private:
    _TMemSet &set_;
};

class A
{
public:
    A(){}
    virtual ~A()
    {
        std::cout << "~A()" << std::endl;
    }

    template<class _TMemSet> bool LoadBTreeNode(_TMemSet &set)
    {
        return LoadBTreeNodeImpl(SetHolderImpl<_TMemSet>(set));
    }

    virtual bool LoadBTreeNodeImpl(const AbstractSetHolder &set) const
    {
        std::cout << "A::LoadBTreeNode" << std::endl;
        return true;
    }
};

class B : public A
{
public:
    B(){}
    virtual ~B()
    {
        std::cout << "~B()" << std::endl;
    }
    virtual bool LoadBTreeNodeImpl(const AbstractSetHolder &set) const
    {
        std::cout << "B::LoadBTreeNode" << std::endl;
        set.insert(12);
        return true;
    }

    virtual int size() const
    {
        return 1;
    }

};

class C : public A
{
public:
    C(){}
    virtual ~C()
    {
        std::cout << "~C()" << std::endl;
    }
    virtual bool LoadBTreeNodeImpl(const AbstractSetHolder &set) const
    {
        std::cout <<"C::LoadBTreeNode" << std::endl;
        set.insert(18);
        set.insert(22);
        return true;
    }

    virtual int size() const
    {
        return 2;
    }

};

int main(int, char **)
{
    A *pB = 0;
    A *pC = 0;

    pB = new B();
    pC = new C();
    boost::unordered_set<int> setI;
    pB->LoadBTreeNode(setI);
    std::set<float> setF;
    pC->LoadBTreeNode(setF);
    delete pB;
    delete pC;
}
avalon/1.0.432
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.