如何实现is_pointer?

时间:2010-07-05 07:13:00

标签: c++ templates

我想实现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

我该如何实施? 感谢

4 个答案:

答案 0 :(得分:20)

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 * volatile和T * const volatile的特化。我想。

解决方案:

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轮,或多或少:)

答案 1 :(得分:10)

From Dr. Dobbs

template <typename T> 
struct is_pointer 
{ static const bool value = false; };

template <typename T> 
struct is_pointer<T*> 
{ static const bool value = true; };

你不能完全你想做什么。你必须使用它:

is_pointer<int*>::value

无法在运行时确定此信息。

答案 2 :(得分:8)

template <typename T>
bool is_pointer(T const &t) // edited: was "T t"; see the comments
{
   return false;
}

template <typename T>
bool is_pointer(T *t)
{
   return true;
}

你可能不相信,但它有效。原因是将选择最具体的模板实现,即采用指针类型的实现。

答案 3 :(得分:-2)

您可以使用typeinfo.h中定义的“typeid”运算符。 点击此链接:http://en.wikipedia.org/wiki/Typeid

typeid运算符将给出std :: type_info类的对象,该对象具有返回char *的name()函数。一旦以字符串形式获得类型,就可以轻松识别指针。

希望它有所帮助。

Romil。