c++ - 模板类/结构组合的好方法

标签 c++ class templates struct

模板化调用需要调用模板化结构的类的最有效方法是什么。这是模板的经典有序列表问题。我的整个有序列表现在有效(当我只是手动更改类型时)。但是,我不确定如何对这对对象(结构和类)进行模板化。

基本上,我的代码结构如下:

struct Node {
    int* data;
    Node* next;
};

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

所以,我的愿望是简单地模板化结构,然后接受一个参数,该参数将模板传递给 Node 结构类型。然而,我的第一次尝试是:

template<class T> 

在 Node 结构之前并将所有 ints* 更改为 T* 惨遭失败。根据任何人的经验,什么可能是更好的方法?任何人都可以指出我正确的方向或给我一些模板基础知识的良好引用吗?我所能找到的都是具体问题,这些问题并没有让我对模板的工作原理有一个很好的了解。

更新:此时我的代码运行良好。我仍然不明白的唯一一件事是如何在函数中返回 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

我得到以下错误:“非模板化的‘节点’用作模板。注意:使用 OList::template Node’来指示它是一个模板(???)错误:在‘OList 之前需要‘typename’::Node' 因为 '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 评论中的建议,定义 Node直接在OList , 所以所有的 <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”实例化之前就有意义),我们需要不断提及这两个 Node在里面QList的范围,以及 QList 的具体实例化在其中找到它是基于模板参数 T .这一切都说得通,但有点迂腐。


至于模板一般是如何工作的,对于 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 .

关于c++ - 模板类/结构组合的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26878519/

相关文章:

python - inspect.signature 究竟如何与类一起工作?

html - 展望负表 margin

c++ - 复合模板

c++ - 无法在未定义的情况下声明模板变量

C++ 重载函数和错误

c++ - 在 C++ : copy or reference, 或中传递只读参数

excel - 在 If 语句中使用变量作为子句

c++ - 动态分配的对象未初始化

c++ - "factor out"公共(public)字段有什么办法可以节省空间?

java - 'registerCustomer()' 应该属于客户类还是主/驱动程序类