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*() { /* ... */ }