2015-07-05 107 views
1

由於虛擬模板方法在C++ 11中不允許,是否有解決方法來從超類調用子類方法? 我有一些類(訪客設計的一部分)。它們是遍歷自定義樹的算法。C++:從超類調用函數模板

用「訪客條款」說話:我的訪問者是遍歷樹的算法,元素是我自定義的類型的迭代器。

總之:我需要一個純粹的虛擬方法,接受任何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>&屬性)
  • 我不想使用void指針,因爲它對我來說感覺不知怎麼髒。
  • 它必須是線程安全的。
+0

任何改變別的東西都是隱含的**不是線程安全的。如果你想要兩者,你需要拋出一個互斥鎖,有條件的或者原子的。 – CoffeeandCode

回答

1

你必須爲你的函數參數使用一個非泛型基類,其他所有的東西都沒有意義,並且暗示了一個設計缺陷。