【问题标题】:C++: call function template from superclassC++:从超类调用函数模板
【发布时间】:2015-09-22 22:54:24
【问题描述】:

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

用“访问者术语”说:我的访问者是遍历树的算法,元素是我的自定义 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&lt;T&gt; 有一个iterator_visitor&lt;T&gt;&amp; 属性)
  • 我不想使用 void 指针,因为我觉得它有点脏。
  • 它必须是线程安全的。

【问题讨论】:

  • 任何改变其他东西的东西都是隐含的不是线程安全的。如果你想要两者,你将需要抛出一个互斥锁、条件或原子。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多