如果将指向用户定义类型的指针作为模板参数传递给模板类,是否可以获取参数的类类型?
template <class T> struct UserType {
typedef T value_type;
...
};
int main () {
typedef std::vector<UserType<double>*> vecType
vecType vec;
vecType::value_type::value_type m; //how to get the double here?
return 0;
}
答案 0 :(得分:5)
使用特征:
template <typename> struct ptr_traits {};
template <typename T> struct ptr_traits<T*>
{ typedef T value_type; };
ptr_traits<vecType::value_type>::value_type m;
答案 1 :(得分:5)
答案 2 :(得分:2)
特质可能是去这里的方式。
或者,您可以引入另一个typedef
并在vecType
和m
的声明中使用此内容:
typedef UserType<double>* UserTypeDoublePtr;
typedef std::vector<UserTypeDoublePtr> vecType;
UserTypeDoublePtr m;
答案 3 :(得分:0)
让我问你“获得”这个类型是什么意思?
您实际上可以使用这种类型,例如,您可以声明此类型的新变量(如您在示例中所示),而无需明确指定它。
你的意思是你想要一个类型的文字描述吗?
如果是这种情况 - 没有通用的100%工作方式。这是因为编译后+链接类型和变量/函数名称消失了。它们在运行时不存在。
但是,您可以编写一些额外的代码来获取所需类型的文本描述。其中一种方法是:
template <typename T> const char* TypeName();
template <> const char* TypeName<int>() { return "int"; }
template <> const char* TypeName<double>() { return "double"; }
// ...
如果您尝试在名称尚未定义的类型上使用TypeName
,则会出现链接器错误。然后,您必须添加TypeName
。