Я думаю о перегрузке std::is_pointer
в C++ 11, чтобы получить значение true для std::shared_ptr<T>
, так как последнее ведет себя очень как T*
.C++ 11: расширение std :: is_pointer to std :: shared_ptr
#include <type_traits>
namespace std {
template <typename T> struct is_pointer<shared_ptr<T>> : std::true_type {};
template <typename T> struct is_pointer<shared_ptr<T const>> : std::true_type {};
}
Интересно, почему эта перегрузка еще не включена в стандартную реализацию. Есть ли какая-то ошибка, которую я не замечаю?
В качестве альтернативы можно было бы, конечно, ввести новый признак is_shared_ptr<T>
.
На самом деле, я попытался следующий код в первую очередь:
template <typename T>
struct is_pointer<shared_ptr<typename std::remove_cv<T>::type>>
: std::true_type
{};
, который не компилируется с GCC 4.7 из-за
error: template parameters not used in partial specialization:
error: ‘T’
'is_pointer' полезен в программировании шаблонов, когда я хочу знать, является ли что-то необработанным типом указателя, а не как указатель. Вы можете реализовать 'is_like_ptr', который делает такие вещи, как тест с SFINAE, если' * p' и '++ p' являются допустимыми выражениями. – aschepler
@aschepler: Умные указатели обычно не поддерживают арифметику. 'is_dereferencable', просто проверка на' * p', может быть более подходящей. –
Хорошая точка. Я не думаю, что проснулся. – aschepler