我理解为什么 member template functions cannot be virtual,但我不确定最佳解决方法是什么。
我有一些类似的代码:
struct Entity
{
template<typename It>
virtual It GetChildren(It it) { return it; }
};
struct Person : public Entity
{
template<typename It>
virtual It GetChildren(It it) { *it++ = "Joe"; }
};
struct Node : public Entity
{
Node left, right;
const char *GetName() { return "dummy"; }
template<typename It>
virtual It GetChildren(It it)
{
*it++ = left.GetName();
*it++ = right.GetName();
return it;
}
};
显然,我需要动态调度。但鉴于这些类实际上非常大,我不想模拟整个类。我仍然想支持任何类型的迭代器。
实现这一目标的最佳方式是什么?
答案 0 :(得分:3)
如果您需要支持任何类型的迭代器,则可以使用使用类型擦除的迭代器。我认为在Boost Sandbox / Vault或Adobe Labs或其中之一的某处实现了any_iterator
。以下是Google的第一个结果:
http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html
答案 1 :(得分:2)
由于您不想模拟整个类,并且不想使用类型擦除的迭代器,唯一的解决方案是编写自己的迭代器。
顺便说一句,你的例子看起来很奇怪。也许你可以看看如何改进设计,这会让你的问题消失。
答案 2 :(得分:1)
您不希望一般“支持任何类型的迭代器”。
您希望满足STL Container要求,以提供用户可以通用支持的迭代器。创建一个迭代器,然后为容器提供一个迭代器typedef:
class Entity_Iterator {
public:
Entity_Iterator operator++() { /* et cetera */ }
Entity& operator*() const { /* et cetera */ }
private:
Entity* entity_ptr_;
// et cetera
}
class Entity_Container {
public:
typedef Entity_Iterator iterator;
iterator begin() const { /* et cetera */ }
iterator end() const { /* et cetera */ }
private:
Entity* head_;
// et cetera
}
现在,用户可以按照STL容器惯例使用容器,并且您也可以将STL算法应用到容器中:
Entity_Container x;
Entity_Container::iterator i = x.begin();
i->GetName();
修改添加链接:
http://www.sgi.com/tech/stl/Container.html
修改强> 的
我正在尝试Google链接到完整的C ++代码存根模板,以实现我记得曾经见过的STL容器,但我发现Google STL模板非常困难。< / p>
修改强> 的
以这种方式执行,您将能够将容器编写为树结构,该结构可以包含使用虚拟方法从Entity继承的异构类型,它看起来就像您正在尝试做的那样?
或许不是?