我想实现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
我该如何实施? 感谢
答案 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)
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。