我有一个类模板,可以传递 Class 或类指针。
/* Template specialization hack to determine if type is a pointer */
struct type_true { };
struct type_false { };
template <class PRT>
class is_pointer : public type_false {
};
template <class PRT>
class is_pointer <PRT * > : public type_true {
};
template <typename T>
class MyClass {
//Return an new instance allocated on stack
T new_instance(type_false n_ptr) {
T new_obj;
//Init stuff
return new_obj;
}
//Return an new instance allocated on heap
T new_instance(type_true is_ptr) {
T new_obj = new T();
//Init stuff
return new_obj;
}
};
编译失败,出现以下错误:
cannot convert 'Class**' to 'Class*' in initialization
我认为这是因为T已经是指针new T()
认为我想分配一个指针指针。 e.g。
OtherClass * new_obj = OtherClass*new();
有什么方法可以从T型或其他解决方案中删除*?
由于 本
答案 0 :(得分:6)
有什么方法可以从T型或其他解决方案中删除*?
当然,你可以。
使用它:(它只删除一个指针度,即它使T * - > T,和T ** - > T *等)
template<typename T>
struct remove_pointer
{
typedef T type;
};
template<typename T>
struct remove_pointer<T*>
{
typedef T type;
};
然后,
typedef typename remove_pointer<T>::type type;
T new_obj = new type();
如果您想制作T***
- &gt; T
即删除所有*
,然后用以下内容替换上述专业:
template<typename T>
struct remove_pointer<T*>
{
typedef typename remove_pointer<T>::type type;
};
答案 1 :(得分:0)
或者使用它,从类型中删除任何级别的间接。
template<typename T> struct stripptr {
typedef T thetype;
};
template<typename T> struct stripptr<T *> {
typedef T thetype;
};
template <typename T> struct MyClass {
static T create() {
T new_obj;
return new_obj;
}
};
template <typename T> struct MyClass<T *> : MyClass<T> {
};