更具体地说,假设我正在写作template<class Pointer> class Foo
,并且我想typedef
在类中声明一个*p
如果是 type 则将具有p
的类型Pointer
。
据我所知,在 C++03 中,唯一的方法是使用类似
typename std::iterator_traits<Pointer>::reference
Pointer
这种方法的缺点是,如果是一些自定义迭代器类型并且作者忘记扩展std::iterator
或以其他方式定义std::iterator_traits
专门化,它将不起作用。
在 C++11 中,我的同事建议
decltype(*Pointer())
但是,如果不是默认可构造的,这将不起作用Pointer
,因此他将其修改为
decltype(**(Pointer*)0)
我试过这个,它奏效了,但后来我认为它看起来有点不确定,因为它涉及空指针的取消引用,因此可能不符合标准。
我们能做得更好吗?