我想实现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
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)
在运行时无法确定这一点.
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)
你可能不相信它,但它有效.原因是将选择最具体的模板实现,即采用指针类型的实现.