Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Decltype for return of a function

I am making a templated class that is a wrapper around any iterator. I am making the operator* this way:

template <typename T>
class MyIterator {
public:
    //...
    decltype(*T()) operator*() {
    //...
    }
}

I give decltype a invocation to operator* of class T, and it even works, but if T doesnt have default constructor it wont work.

Is there anyway to find out the returned type of a function/method ?

like image 833
André Puel Avatar asked Jul 26 '11 22:07

André Puel


1 Answers

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*() { /* ... */ }
like image 81
James McNellis Avatar answered Oct 09 '22 23:10

James McNellis