C++使用新的操作符,模板提供了模板名

C++使用新的操作符,模板提供了模板名,c++,templates,C++,Templates,我有一个类模板,可以传递一个类或类指针 我想这是因为T已经是一个指针了,新的T认为我想把一个指针分配给一个指针。e、 g OtherClass * new_obj = OtherClass*new(); 有什么方法可以从T型或其他解决方案中去除*吗 谢谢 本 有什么方法可以从T型或其他解决方案中去除*吗 当然可以 使用这个:它只删除一个程度的点性,即它使T*->T,和T**->T*,等等 template<typename T> struct remove_pointer {

我有一个类模板,可以传递一个类或类指针

我想这是因为T已经是一个指针了,新的T认为我想把一个指针分配给一个指针。e、 g

OtherClass * new_obj = OtherClass*new();
有什么方法可以从T型或其他解决方案中去除*吗

谢谢 本

有什么方法可以从T型或其他解决方案中去除*吗

当然可以

使用这个:它只删除一个程度的点性,即它使T*->T,和T**->T*,等等

template<typename T>
struct remove_pointer
{
    typedef T type;
};

template<typename T>
struct remove_pointer<T*>
{
    typedef T type;
};

或者使用此选项,从类型中删除任何级别的间接寻址

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> {
};

你有更深层次的问题。返回一个在堆栈上分配的新实例。首先,C++没有堆栈的概念,你创建的是一个自动变量。然后你不返回它,你返回一个很好的拷贝,因为自动变量的生命周期在任何东西都可以使用之前结束。@本,C++确实有一个堆栈的概念,但其余的解释都是好的。如果函数调用的返回值被分配给另一个堆栈变量,则返回值将从堆栈上即将释放的一个位置复制,因为函数将返回堆栈上的另一个位置。在某些情况下,它可能是相当透明的,但是C++最有一个栈。@ A. Levy:C++标准在异常处理期间有一个栈解卷的概念,但不是一个调用堆栈。只要实现了规定的行为,任何数据结构都可以用于参数、返回值和需要调用堆栈的自动变量,这将禁止尾部调用优化。大多数实现都使用堆栈,但这是实现特定的细节。例如,在ARM体系结构中,您所说的将在堆栈上的所有内容可能都在寄存器中。@Ben:啊……我现在更理解您的说法了。谢谢
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();
template<typename T>
struct remove_pointer<T*>
{
    typedef typename remove_pointer<T>::type type;
};
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> {
};