假设我们有模板类
template <typename T>
class MyTem{
public:
bool is_T_Pointer(){
<...>
}
};
class Cls : MyTem<Cls>{
<...>
};
int main(void){
Cls* classOnHeap = new Cls(); /* T is pointer */
Cls classOnStack; /* T is not pointer */
<...>
}
我知道这是一个糟糕的例子,但是如果有人能帮助我找出T是否是来自模板类的指针会很棒。
请记住,我们有与基类相同类的模板的继承。
不必完全实现,模糊的技术就足够了
答案 0 :(得分:4)
你应该在这里使用部分专业化:
template<class T>
class A
{
public:
A() {}
};
template<class T>
class A<T*>
{
public:
A(int) {}
};
然后以下将无法编译,因为编译器被迫选择模板的指针版本并且没有默认构造函数:
A<char*> a;
这确实编译:
A<char> a;
答案 1 :(得分:3)
如果编译器支持C ++ 11,请使用std::is_pointer
:
#include <iostream>
#include <type_traits>
template <typename T>
class MyTem
{
public:
static const bool IS_POINTER = std::is_pointer<T>::value;
};
int main()
{
std::cout << MyTem<char*>::IS_POINTER << "\n";
std::cout << MyTem<char>::IS_POINTER << "\n";
return 0;
}
请参阅演示http://ideone.com/Mo394。