如何实现is_pointer?

2023-11-21

我想实现is_pointer。我想要这样的东西:

template <typename T >
bool is_pointer( T t )
{
   // implementation
} // return true or false

int a;
char *c;
SomeClass sc;
someAnotherClass *sac;

is_pointer( a ); // return false

is_pointer( c ); // return true

is_pointer( sc ); // return false

is_pointer( sac ); // return true

我该如何实施? 谢谢


template <typename T>
struct is_pointer_type
{
    enum { value = false };
};

template <typename T>
struct is_pointer_type<T*>
{
    enum { value = true };
};

template <typename T>
bool is_pointer(const T&)
{
    return is_pointer_type<T>::value;
}

约翰内斯指出:

我认为这实际上缺少 T *const、T *volatility 和 T * const volatility 的专业化。

解决方案:

template <typename T>
struct remove_const
{
    typedef T type;
};

template <typename T>
struct remove_const<const T>
{
    typedef T type;
};

template <typename T>
struct remove_volatile
{
    typedef T type;
};

template <typename T>
struct remove_volatile<volatile T>
{
    typedef T type;
};

template <typename T>
struct remove_cv : remove_const<typename remove_volatile<T>::type> {};

template <typename T>
struct is_unqualified_pointer
{
    enum { value = false };
};

template <typename T>
struct is_unqualified_pointer<T*>
{
    enum { value = true };
};

template <typename T>
struct is_pointer_type : is_unqualified_pointer<typename remove_cv<T>::type> {};

template <typename T>
bool is_pointer(const T&)
{
    return is_pointer_type<T>::value;
}

...但是当然这只是重新发明std::type_traits轮子,或多或少:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现is_pointer? 的相关文章

随机推荐