У меня есть класс
template <typename Iterator, typename Value>
class Foo {
public:
Foo(const Iterator& it) { ... }
...
private:
map<Value, int> m_;
}
};
Есть ли способ избавиться от значения в шаблоне? Итератор может быть или не быть итератором STL, но он гарантировал, что * это тип Value.
Я знаю о iterator_traits<T>::value_type
для итераторов STL, но задаюсь вопросом, есть ли способ получить тип значения автоматически для любого типа Iterator?
Один трюк, о котором я думаю - скажем, у нас есть вспомогательный класс
template <typename Iterator, typename Value>
class Bar {
public:
Bar(const Iterator& dummy_iterator, const Value& dummmy_value) {}
...
};
Тогда, если мы создадим Bar как Bar (it, * it), тип Value будет известен внутри Bar. Но я не могу найти хороший способ комбинировать Bar с Foo.