模板化类/结构组合的好方法

Good way to template a class/struct combination

本文关键字:组合 方法 结构      更新时间:2023-10-16

对调用的类进行模板化的最有效方法是什么?需要调用模板化结构。这是典型的模板排序列表问题。到目前为止,我的整个排序列表都可以工作(当我只是手动更改类型时)。然而,我不知道如何对这对对象(结构和类)进行模板化。

因此,基本上,以下是我的代码的结构:

struct Node {
    int* data;
    Node* next;
};
class OList {
    private:
        Node* start;
        int size;
    public:
        a bunch of manipulation functions
};

因此,我的愿望是简单地对结构进行模板化,然后接受一个参数,该参数将把模板传递到Node结构类型中。然而,我的第一次尝试是:

template<class T> 

之前Node结构并将所有CCD_ 1改为CCD_。根据任何人的经验,什么可能是更好的方法?有人能为我指明正确的方向吗?或者给我一些模板基础的好参考?我所能找到的只是一些具体的问题,这些问题并不能给我一个很好的模板工作的背景。

更新:我的代码在这一点上运行得非常好。我唯一还不明白的是如何在函数中返回Node结构的指针。例如,在一个可能是的函数中

template <class T>
List<T>::Node<T>* List<T>pos(int val); //trying to return a pointer to the node at a specified spot

我得到以下错误:"未模板化的'Node'用作模板。注意:使用OList::template-Node'来指示它是模板(??)错误:需要在'OList:;Node'之前使用'typename',因为'OList是一个依赖作用域。"清除这些错误的最有效方法是什么?当这一个函数被注释掉时,代码可以完美地工作。

template <typename T>     // <----
struct Node {
    T* data;              // <----
    Node* next;
};
template <typename T>     // <----
class OList {
    private:
        Node<T>* start;   // <----
        int size;
    public:
        a bunch of manipulation functions
};

或者。。。

template <typename T>
class OList {
    private:
        typedef ::Node<T> Node;  // <---- just do it once
        Node* start;   

或者正如BWG的评论中所建议的,直接在OList中定义Node,所以所有的<T>方面都是隐含的。。。

template <typename T>
class OList {
    private:
        struct Node { T* data; int size; };  // <----
        Node* start;   

越界成员函数定义示例:

template <typename T>
class OList
{
    private:
        struct Node { T* data; };
        Node* f(Node*);
    public:
};
template <typename T>
typename OList<T>::Node* OList<T>::f(typename OList<T>::Node* p)   // see notes
{
    Node* p2 = p;    // can use Node as if inside class definition
    return p2;
}

注意丑陋的线条。。。

typename OList<T>::Node* OList<T>::f(typename OList<T>::Node* p)

其中typename需要指示NodeQList<T>内命名一个类型(因此它可以做更多的工作来确保该函数甚至在为任何特定类型'T'实例化之前就有意义),并且我们需要不断提到Nodeints*0的范围内,并且要在其中找到的CCD_ 11的具体实例化是基于模板参数CCD_。这一切都很有道理,但有点迂腐。


至于模板通常是如何工作的,对于Stack Overflow的答案来说,这可能"太宽泛了",但FWIW可能是最快开始对其进行实际理解的方法(之后需要进行一些改进),就是将它们与宏进行比较。考虑:

#define NODE(T)      
struct Node ## T {   
    T* data;         
    Node ## T* next; 
};

这样,就可以说NODE(int)NODE(float)来为这些类型生成Node_intNode_float结构。有了模板,你不需要(通常)单独定义每个专业化——它在使用时是隐含的("参数多态性")——所以只需开始将它们用于变量ala Node<int> my_node_for_ints

你的意思是:

template <typename T>
struct Node {
    T data;
    Node* next;
};
template <typename T>
class OList {
    private:
        Node<T> start;
        int size;
    public:
};