Здравствуйте, 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;
}