我正在尝试从传递给宏的指针中提取类类型。这是我到目前为止所拥有的
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;
这甚至可能吗?我吠叫错了树吗?
答案 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提供的建议来删除指针和引用修饰符。