如何判断一个变量或类型是否为指针

时间:2022-07-10 17:00:27
我在做一个做一个容器类的模板。
当T为int* 时。。我发现输出函数不好写
需要判断T是否为指针
如果为指针,会直接输出地址,而不是输出内容

15 个解决方案

#1


那你最好做2个容器模板,一个专门放指针,另一个专门放非指针,不然以后会出问题的

#2


搜索偏特化

#3


std::tr1::is_pointer

#4


vector是如何实现的。。。我看标准库太蛋疼了。。。直接看源码脑子大大的

#5


引用 2 楼 pengzhixi 的回复:
搜索偏特化

模板特化的话
template<typename T>
class chain<T*>{...};这样可不可以

#6


你先试试再说

#7


template<typename T>
class chain{};
template<typename T>
class chain<T*>{};
能实现么

#8


引用 7 楼 yuyuyu101 的回复:
template<typename T>
class chain{};
template<typename T>
class chain<T*>{};
能实现么

可以的

#9


模板具体化。
一般的通用模板遇到一些特殊类型需要特殊处理的时候都需要实现模板具体化。
为对应类型声明一个具体的模板。
例如:
template <class T>
class{};

具体化
template <> 
class<class T*>
{};

#10


额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

#11


用的时候就不麻烦了。

#12


引用 10 楼 yuyuyu101 的回复:
额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

可以这样:

#include<iostream>

using namespace std;

template<typename T>
bool IsPtr(const T * const &)
{
    return true;
}

bool IsPtr(...)
{
    return false;
}

int func(int)
{
    return 0;
}

int main()
{
    int a[2] = {0};
    int i = 0;
    int *p = 0;
    const int *cp = 0;
    int *const pc = 0;
    const int *const cpc = 0;
    
    cout<<IsPtr(a)<<endl;//数组名不是指针 
    cout<<IsPtr(func)<<endl;//函数名不是指针
    
    cout<<IsPtr(i)<<endl;
    
    cout<<IsPtr(p)<<endl;
    cout<<IsPtr(cp)<<endl;
    cout<<IsPtr(pc)<<endl;
    cout<<IsPtr(cpc)<<endl;

    system("pause");
    return 0;
}

#13


引用 10 楼 yuyuyu101 的回复:
额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

也可以这样使用类模板的偏特化

#include<iostream>

using namespace std;

template<typename T>
class aux
{
    enum{val = 0};
};

template<typename T>
class aux<T *>
{
    enum{val = 1};
};

template<typename T>
bool IsPtr(const T &)
{
    return aux<T>::val;
}

int func(int)
{
    return 0;
}

int main()
{
    int a[2] = {0};
    int i = 0;
    int *p = 0;
    const int *cp = 0;
    int *const pc = 0;
    const int *const cpc = 0;
    
    cout<<IsPtr(a)<<endl;//数组名不是指针 
    cout<<IsPtr(func)<<endl;//函数名不是指针
    
    cout<<IsPtr(i)<<endl;
    
    cout<<IsPtr(p)<<endl;
    cout<<IsPtr(cp)<<endl;
    cout<<IsPtr(pc)<<endl;
    cout<<IsPtr(cpc)<<endl;

    system("pause");
    return 0;
}

#14


引用 13 楼 we_sky2008 的回复:
引用 10 楼 yuyuyu101 的回复:
额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

也可以这样使用类模板的偏特化

C/C++ code

#include<iostream>

using namespace std;

template<typename T>
class aux
{
 ……

忘记写public了,应该这样:

#include<iostream>

using namespace std;

template<typename T>
class aux
{
public:
    enum{val = 0};
};

template<typename T>
class aux<T *>
{
public:
    enum{val = 1};
};

template<typename T>
bool IsPtr(const T &)
{
    return aux<T>::val;
}

int func(int)
{
    return 0;
}

int main()
{
    int a[2] = {0};
    int i = 0;
    int *p = 0;
    const int *cp = 0;
    int *const pc = 0;
    const int *const cpc = 0;
    
    cout<<IsPtr(a)<<endl;//数组名不是指针 
    cout<<IsPtr(func)<<endl;//函数名不是指针
    
    cout<<IsPtr(i)<<endl;
    
    cout<<IsPtr(p)<<endl;
    cout<<IsPtr(cp)<<endl;
    cout<<IsPtr(pc)<<endl;
    cout<<IsPtr(cpc)<<endl;

    system("pause");
    return 0;
}

#15


额,第一种。。const T * const &这是什么意思。

#1


那你最好做2个容器模板,一个专门放指针,另一个专门放非指针,不然以后会出问题的

#2


搜索偏特化

#3


std::tr1::is_pointer

#4


vector是如何实现的。。。我看标准库太蛋疼了。。。直接看源码脑子大大的

#5


引用 2 楼 pengzhixi 的回复:
搜索偏特化

模板特化的话
template<typename T>
class chain<T*>{...};这样可不可以

#6


你先试试再说

#7


template<typename T>
class chain{};
template<typename T>
class chain<T*>{};
能实现么

#8


引用 7 楼 yuyuyu101 的回复:
template<typename T>
class chain{};
template<typename T>
class chain<T*>{};
能实现么

可以的

#9


模板具体化。
一般的通用模板遇到一些特殊类型需要特殊处理的时候都需要实现模板具体化。
为对应类型声明一个具体的模板。
例如:
template <class T>
class{};

具体化
template <> 
class<class T*>
{};

#10


额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

#11


用的时候就不麻烦了。

#12


引用 10 楼 yuyuyu101 的回复:
额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

可以这样:

#include<iostream>

using namespace std;

template<typename T>
bool IsPtr(const T * const &)
{
    return true;
}

bool IsPtr(...)
{
    return false;
}

int func(int)
{
    return 0;
}

int main()
{
    int a[2] = {0};
    int i = 0;
    int *p = 0;
    const int *cp = 0;
    int *const pc = 0;
    const int *const cpc = 0;
    
    cout<<IsPtr(a)<<endl;//数组名不是指针 
    cout<<IsPtr(func)<<endl;//函数名不是指针
    
    cout<<IsPtr(i)<<endl;
    
    cout<<IsPtr(p)<<endl;
    cout<<IsPtr(cp)<<endl;
    cout<<IsPtr(pc)<<endl;
    cout<<IsPtr(cpc)<<endl;

    system("pause");
    return 0;
}

#13


引用 10 楼 yuyuyu101 的回复:
额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

也可以这样使用类模板的偏特化

#include<iostream>

using namespace std;

template<typename T>
class aux
{
    enum{val = 0};
};

template<typename T>
class aux<T *>
{
    enum{val = 1};
};

template<typename T>
bool IsPtr(const T &)
{
    return aux<T>::val;
}

int func(int)
{
    return 0;
}

int main()
{
    int a[2] = {0};
    int i = 0;
    int *p = 0;
    const int *cp = 0;
    int *const pc = 0;
    const int *const cpc = 0;
    
    cout<<IsPtr(a)<<endl;//数组名不是指针 
    cout<<IsPtr(func)<<endl;//函数名不是指针
    
    cout<<IsPtr(i)<<endl;
    
    cout<<IsPtr(p)<<endl;
    cout<<IsPtr(cp)<<endl;
    cout<<IsPtr(pc)<<endl;
    cout<<IsPtr(cpc)<<endl;

    system("pause");
    return 0;
}

#14


引用 13 楼 we_sky2008 的回复:
引用 10 楼 yuyuyu101 的回复:
额。。。实现是实现了。不过等于做了两个模板。。。全部要复制一遍。。然后再修改一下T ->T*,有点麻烦。。是这样吗

也可以这样使用类模板的偏特化

C/C++ code

#include<iostream>

using namespace std;

template<typename T>
class aux
{
 ……

忘记写public了,应该这样:

#include<iostream>

using namespace std;

template<typename T>
class aux
{
public:
    enum{val = 0};
};

template<typename T>
class aux<T *>
{
public:
    enum{val = 1};
};

template<typename T>
bool IsPtr(const T &)
{
    return aux<T>::val;
}

int func(int)
{
    return 0;
}

int main()
{
    int a[2] = {0};
    int i = 0;
    int *p = 0;
    const int *cp = 0;
    int *const pc = 0;
    const int *const cpc = 0;
    
    cout<<IsPtr(a)<<endl;//数组名不是指针 
    cout<<IsPtr(func)<<endl;//函数名不是指针
    
    cout<<IsPtr(i)<<endl;
    
    cout<<IsPtr(p)<<endl;
    cout<<IsPtr(cp)<<endl;
    cout<<IsPtr(pc)<<endl;
    cout<<IsPtr(cpc)<<endl;

    system("pause");
    return 0;
}

#15


额,第一种。。const T * const &这是什么意思。