我正在创建一个模板化的类,它是任何迭代器的包装器。我正在以这种方式制作运营商:
template <typename T>
class MyIterator {
public:
//...
decltype(*T()) operator*() {
//...
}
}
我给decltype一个调用给类T的operator *,它甚至可以工作,但是如果T没有默认构造函数它就不会工作。
有没有找到函数/方法的返回类型?
答案 0 :(得分:16)
这是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*() { /* ... */ }