用于返回函数的Decltype

And*_*uel 9 c++ templates decltype c++11

我正在创建一个模板化的类,它是任何迭代器的包装器.我这样做运营商*:

template <typename T>
class MyIterator {
public:
    //...
    decltype(*T()) operator*() {
    //...
    }
}
Run Code Online (Sandbox Code Playgroud)

我给decltype一个调用给类T的operator*,它甚至可以工作,但是如果T没有默认构造函数它就不会工作.

有没有找到函数/方法的返回类型?

Jam*_*lis 16

std::declval是为了什么:

decltype(*std::declval<T>()) operator*() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

如果您的实现没有提供std::declval(Visual C++ 2010不包含它),您可以自己轻松编写它:

template <typename T>
typename std::add_rvalue_reference<T>::type declval(); // no definition required
Run Code Online (Sandbox Code Playgroud)

由于T是迭代器类型,您还可以使用std::iterator_traits模板,该模板不需要任何C++ 0x支持:

typename std::iterator_traits<T>::reference operator*() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)