在编译时确定指针类型

时间:2012-06-26 21:48:12

标签: c++ templates visual-c++ visual-studio-2005

我正在尝试从传递给宏的指针中提取类类型。这是我到目前为止所拥有的

template <class CLASS> class getter
{
public:
    typedef CLASS type;
};
template <class CLASS> getter<CLASS> func(const CLASS* const)
{
    return getter<CLASS>();
}
...
#define GETTYPE(PTR) func(p)::type
...
MyClass *p = new MyClass;
...
GETTYPE(p) myClass;

这甚至可能吗?我吠叫错了树吗?

3 个答案:

答案 0 :(得分:2)

您可以在C ++ 11中使用decltype

答案 1 :(得分:1)

是和否。您可以从知道的通用类型中提取它是模板的指向类型。但你不能用一个功能来做。 C ++ 11中的一个简单实现是std::remove_pointer,它在以下行中实现:

template <typename T>
struct remove_ptr {       // Non pointer generic implementation
   typedef T type;
};
template <typename T>
struct remove_ptr<T*> {   // Ptr specialization:
   typedef T type;
};

使用:

template <typename T> void foo( T x ) {
   typedef typename remove_ptr<T>::type underlying_type;
}
int main() {
   foo( (int*)0 ); // underlying_type inside foo is int
   foo( 0 );       // underlying_type inside foo is also int
}

答案 2 :(得分:1)

我认为你正在咆哮错误的树。如果你有一个变量,你可以通过模板参数或声明来知道它的类型。如果声明中的类型是显式的,那么您已经拥有它,因此无需询问编译器。如果要查找一致性,请在功能块的开头尝试typedef。如果类型来自模板参数,请使用David提供的建议来删除指针和引用修饰符。