模板化类/结构组合的好方法
Good way to template a class/struct combination
对调用的类进行模板化的最有效方法是什么?需要调用模板化结构。这是典型的模板排序列表问题。到目前为止,我的整个排序列表都可以工作(当我只是手动更改类型时)。然而,我不知道如何对这对对象(结构和类)进行模板化。
因此,基本上,以下是我的代码的结构:
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
需要指示Node
在QList<T>
内命名一个类型(因此它可以做更多的工作来确保该函数甚至在为任何特定类型'T'实例化之前就有意义),并且我们需要不断提到Node
在ints*
0的范围内,并且要在其中找到的CCD_ 11的具体实例化是基于模板参数CCD_。这一切都很有道理,但有点迂腐。
至于模板通常是如何工作的,对于Stack Overflow的答案来说,这可能"太宽泛了",但FWIW可能是最快开始对其进行实际理解的方法(之后需要进行一些改进),就是将它们与宏进行比较。考虑:
#define NODE(T)
struct Node ## T {
T* data;
Node ## T* next;
};
这样,就可以说NODE(int)
或NODE(float)
来为这些类型生成Node_int
和Node_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:
};
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在 std::visit 中跳过变体类型的一些重载组合的方法是什么?
- 使用Set/Get-like方法或GetSet组合函数
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- 在C++中将返回unique_ptr和shared_ptr的两个工厂方法组合为一个
- 从组合类公开模板参数的替代方法
- 实现虚拟方法的组合行为
- 将8 UINT8_T组合到单个UINTMAX_T中的最快方法是什么?
- 组合来自多个线程的数据的标准方法?
- 有没有更干净的方法将 std::string 组合到 std::vector <char>中?
- 设计生成所有 n 位数字组合的递归函数的最佳方法是什么?
- 所有的组合算法和解决C++问题的一般方法
- 这是组合std::generate_n和std::back_inserter的正确方法吗
- 将两个双数组集组合为一个查找其并集和交集的最简单方法
- 释放组合结构内存的正确方法
- 使用组合而不是继承的方法转发(使用C++特性)
- 将两种方法组合在一起
- 访问组合方法
- 模板化类/结构组合的好方法
- 函数组合-组合方法优化