I am making a templated class that is a wrapper around any iterator. I am making the operator* this way:
template
class MyIterator {
public:
This is what std::declval
is for:
decltype(*std::declval<T>()) operator*() { /* ... */ }
If your implementation does not provide std::declval
(Visual C++ 2010 does not include it), you can easily write it yourself:
template <typename T>
typename std::add_rvalue_reference<T>::type declval(); // no definition required
Since T
is an iterator type, you could also use the std::iterator_traits
template, which does not require any C++0x support:
typename std::iterator_traits<T>::reference operator*() { /* ... */ }