将类型参数传递给自引用指针

Passing type parameter to self-referential pointer

本文关键字:自引用 指针 参数传递 类型      更新时间:2023-10-16
template <class T>
class Node {
    private:
        T m_value;
        //Node* m_ptr;    //(1)
        //Node<T>* m_ptr; //(2)
};

有人可以解释一下上述两种说法(1(和(2(有什么区别吗?这两个陈述似乎都编译了,但我似乎找不到 ISO C++对它们的看法。

它们是一回事,因为您在模板中声明指针,因此当您创建Node的实例时,编译器知道T是什么。如果可以推导模板,则不必指定模板的类型,例如从参数类型推导,或者在这种情况下从指针所属的模板实例推导。

template <class T>
class Node {
public:
    T m_value;
    Node* m_ptr;    //(1)
    //Node<T>* m_ptr; //(2)
};
int main()
{
    Node<float> test;
    test.m_ptr = new Node<float>{}; // valid
    test.m_ptr = new Node<bool>{};  // invalid - triggers compiler error
    auto val = test.m_ptr->m_value; // val will be of float type
}

根据C++标准(14.6.1 本地声明的名称(

3 类模板

或类模板的注入类名 专用化可以用作模板名称或类型名称 无论它在范围内。[ 示例:

template <class T> struct Base {
Base* p;
};
template <class T> struct Derived: public Base<T> {
typename Derived::Base* p; // meaning Derived::Base<T>
};
template<class T, template<class> class U = T::template Base> struct Third { };
Third<Base<int> > t; // OK: default argument uses injected-class-name as a template

— 结束示例 ]

因此这些数据成员声明

Node* m_ptr;    //(1)
Node<T>* m_ptr; //(2)

是等效的,因为注入的类名Node用于类定义的作用域。

它们是"相同的">

我认为这就是它正在发生的事情,在

节点* m_ptr_n

编译器使类型与类类型匹配。

在以下情况下:

节点* m_ptr

它创建的是一个指向与"T"类型匹配的类女巫模板的指针。

如果要获取指向浮点实例的 int 实例,可以做的是将这两种类型传递给模板。

template <class T1, class T2, class T3>
    class Node {
    public:
         T1 m_value;
         // Node* m_ptr_n;    //(1)
         Node<T2, T3>* m_ptr; //(2)
    };