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指針,因爲它對我來說感覺不知怎麼髒。
- 它必須是線程安全的。
任何改變別的東西都是隱含的**不是線程安全的。如果你想要兩者,你需要拋出一個互斥鎖,有條件的或者原子的。 – CoffeeandCode