成员模板功能不能是虚拟的 - 解决方法?

时间:2011-11-11 20:57:50

标签: c++ virtual-method member-functions

我理解为什么 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;
    }
};

显然,我需要动态调度。但鉴于这些类实际上非常大,我不想模拟整个类。我仍然想支持任何类型的迭代器。

实现这一目标的最佳方式是什么?

3 个答案:

答案 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继承的异构类型,它看起来就像您正在尝试做的那样?

或许不是?