Чтобы быть более конкретным, предположим, что я пишу template<class Pointer> class Foo
, и я хочу объявить typedef
внутри класса для типа, который *p
имел бы, если p
имел тип Pointer
.
В С++ 03, насколько мне известно, единственный способ сделать это - что-то вроде
typename std::iterator_traits<Pointer>::reference
Недостатком этого метода является то, что он не будет работать, если Pointer
- это какой-то пользовательский тип итератора, и автор забыл расширить std::iterator
или иначе определить специализацию std::iterator_traits
.
В С++ 11 мой коллега предложил
decltype(*Pointer())
Но это не сработает, если Pointer
не является конструктивным по умолчанию, поэтому он изменил это на
decltype(**(Pointer*)0)
Я пробовал это, и это сработало, но потом я подумал, что это выглядит немного, потому что оно связано с разыменованием нулевого указателя и, следовательно, может быть не совместимо со стандартами.
Можем ли мы сделать лучше?