如何将单个Template语句用于多个函数或结构?

时间:2010-11-25 03:58:41

标签: c++ templates generic-programming

我一直在尝试将Stacks表示为模板,我使用了一个结构,并且每件事情都很好,但每次我想编写模板函数时,我都必须编写相同的模板语句,这似乎并不像正确 - 尽职尽责 -

那么如何为所有函数编写一个模板语句?这是我的代码:

template <typename T>
struct Stack
{
    T Value;
    Stack* next;
};
template <typename T>
void Push(T Value,Stack* &Top)
{
    Stack * Cell = new Stack();
    Cell->Value = Value;
    Cell->next = Top;
    Top = Cell;
};
template <typename T>
bool IsEmpty(Stack * Top)
{
    return (Top==0);
}
template <typename T>
void Pop(T &Value,Stack* &Top)
{
    if (IsEmpty(Top))
        cout  * Temp = Top;
        Value = Top->Value;
        Top = Top->next;
        delete Temp;
    }
}
template <typename T>
void GetTop(T &Value, Stack* &Top)
{
    if (IsEmpty(Top))
        cout Value;
}
template <typename T>
void EmptyStack(Stack * &Top)
{
    Stack * Temp;
    while (!(IsEmpty(Top)))
    {
        Temp = Top;
        Top = Top->next;
        delete Temp;
    }
}

希望我的意思现在很清楚,对于这个小问题感到抱歉:(

提前感谢。

2 个答案:

答案 0 :(得分:3)

如果(基于你的评论似乎是这种情况)你想要它们作为免费功能,你不能。您还必须更改Stack参数,如下所示:

template <typename T>
void Push(T Value, Stack<T>* &Top)
{
    Stack * Cell = new Stack();
    Cell->Value = Value;
    Cell->next = Top;
    Top = Cell;
};

就目前而言,我对你的设计并不太兴奋。您尝试将Stack类型用作实际堆栈,作为堆栈中的单个节点(Cell)。这充其量是不必要的混淆。

编辑:就堆栈与节点而言,我所说的是(如上面的代码所示):Stack *Cell = new Stack(); - 你正在分配一个 in的单元格堆栈,但您使用的类型 Stack

我会做这样的事情:

template <class T>
struct Stack { 
    struct node { 
        T data;
        node *next;
    };

    node *head;
};

template <class T> 
void push(T item, Stack<T> *&s) { 
    Stack<T>::node *n = new Stack<T>:node();       
    n->data = item;
    n->next = s->head;
    s->head = n;
}

它在你真正做的事情上没有太大的区别,但当你把东西放到堆栈上时,分配一个Stack<T>::node似乎(至少对我而言)要做得更多感觉比分配Stack<T>。包含多个节点的堆栈是有意义的 - 包含多个堆栈的堆栈实际上没有。

答案 1 :(得分:0)

您可以简单地编写一个模板类,并将所有这些函数编写为该类的方法。然后,它们将与该类共享相同的模板参数。