2

假设我们有模板类

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 是否是来自模板类的指针,那就太好了。

请记住,我们具有与基类相同类的模板的继承。

不必是完整的实现,一个模糊的技术就足够了

4

2 回答 2

5

您应该在这里使用部分专业化:

template<class T>
class A
{
public:
    A() {}
};

template<class T>
class A<T*>
{
public:
    A(int) {}
};

那么下面的就不会编译了,因为编译器被迫选择模板的指针版本并且没有默认的构造函数:

A<char*> a;

这确实编译:

A<char> a;
于 2012-08-10T09:47:22.560 回答
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

于 2012-08-10T09:37:09.250 回答