我想在C++ 11中重载std::is_pointer
以产生std::shared_ptr<T>
也是如此,因为后者的行为非常像T*
。C++ 11:将std :: is_pointer扩展到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'在模板编程中很有用,当我想知道某些东西是否是原始指针类型,而不仅仅是指针。如果'* p'和'++ p'是有效的表达式,你可以实现一个'is_like_ptr',它执行类似SFINAE的测试。 – aschepler
@aschepler:智能指针通常不支持算术。 'is_dereferencable',只是检查'* p',可能更合适。 –
好点。我觉得我还没有醒过来。 – aschepler