如何实现is_pointer?

Dav*_*yan 6 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
Run Code Online (Sandbox Code Playgroud)

我该如何实现它?谢谢

fre*_*low 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;
}
Run Code Online (Sandbox Code Playgroud)

约翰内斯指出:

这实际上是缺少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;
}
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*der 10

来自Dobbs博士.

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

template <typename T> 
struct is_pointer<T*> 
{ static const bool value = true; };
Run Code Online (Sandbox Code Playgroud)

你不能这样做正是你想做的事.你必须使用这个:

is_pointer<int*>::value
Run Code Online (Sandbox Code Playgroud)

在运行时无法确定这一点.

  • 好吧,实际上如果你可以在编译时使用它,那么你可以在运行时使用它.反过来通常更难.无论如何,这是我想要的解决方案......或者只是使用Boost Type Traits库. (2认同)

Tho*_*mas 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;
}
Run Code Online (Sandbox Code Playgroud)

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