Decltype для возврата функции

Я создаю шаблонный класс, который является оболочкой вокруг любого итератора. Я делаю оператор* таким образом:

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

Я даю decltype вызов оператору * класса T, и он даже работает, но если T не имеет конструктора по умолчанию, он не будет работать.

есть ли в любом случае, чтобы узнать возвращаемый тип функции/метода ?

1 ответов


это std::declval для:

decltype(*std::declval<T>()) operator*() { /* ... */ }

если ваша реализация не предусматривает std::declval (Visual C++ 2010 не включает его), вы можете легко написать его самостоятельно:

template <typename T>
typename std::add_rvalue_reference<T>::type declval(); // no definition required

С T является типом итератора, вы также можете использовать std::iterator_traits шаблон, который не требует поддержки C++0x:

typename std::iterator_traits<T>::reference operator*() { /* ... */ }