C ++:从超类调用函数模板

时间:2015-07-05 20:54:22

标签: c++ multithreading templates c++11 virtual

由于C ++ 11中不允许使用虚拟模板方法,是否有一种从超类调用子类方法的解决方法? 我有一些课程(访客设计的一部分)。它们是遍历自定义树的算法。

在&#34;访问者条款中说话&#34;:我的访问者是遍历树的算法,元素是我的自定义tree<T>类型的迭代器。

简而言之:我需要一个接受任何type_of_iterator<T>的纯虚方法,而不使用奇怪的重复模板模式(iterator_visitor<T>必须对每个具体访问者都相同。)

// this is the virtual visitor
template <typename T>
class iterator_visitor {
    // increments FORWARD regardless the  iterator verse
    template <typename It> virtual void increment(const It&) const = 0;
    // increments BACKWARD regardless the iterator verse
    template <typename It> virtual void decrement(const It&) const = 0; 
    void visit_increment(iterator<T>&) const;
    void visit_decrement(iterator<T>&) const;
    // same for const_iterator<T>, reverse_iterator<T> and const_reverse_iterator<T>
};

// concrete iterator example
class pre_order final : public iterator_visitor<T> {
    template <typename Iterator> void increment(const Iterator&) const override;
    template <typename Iterator> void decrement(const Iterator&) const override;
};

我的要求是:

  • 我需要一个独特的界面来引用访问者(没有CRTP),并从这个界面调用visit_increment(...)visit_decrement(...)方法。 (tree<T>具有iterator_visitor<T>&属性)
  • 我不想使用无效指针,因为它对我来说感觉有点脏。
  • 必须是线程安全的。

1 个答案:

答案 0 :(得分:1)

你必须为你的函数参数使用一个非通用的基类,其他一切都没有意义,并暗示一个设计缺陷。