Decltype для возврата функции - PullRequest
9 голосов
/ 27 июля 2011

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

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

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

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

1 Ответ

16 голосов
/ 27 июля 2011

Вот для чего 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*() { /* ... */ }
...