Как использовать один оператор шаблона для более чем одной функции или структуры? - PullRequest
0 голосов
/ 25 ноября 2010

Я пытался представить Stacks как шаблон, я использовал структуру, и все хорошо, но каждый раз, когда я хотел написать функцию шаблона, мне приходилось писать один и тот же оператор шаблона, который не выглядел правильно-достаточно хорошо работает-

Так, как я могу написать один шаблон для всех функций? Вот мой код:

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

Надеюсь, что я имею в виду, теперь понятно, извините за небольшой вопрос: (

спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Если (как представляется, основываясь на вашем комментарии) вы хотите, чтобы они были бесплатными функциями, вы не сможете.Вам также придется изменить параметр Stack, что-то вроде этого:

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

В его нынешнем виде я не слишком рад вашему дизайну.Вы пытаетесь использовать тип Stack в качестве фактического стека, и в качестве одного узла (ячейки) в стека.В лучшем случае это излишне сбивает с толку.

Редактировать: Что касается стека и узла, я говорю о том (как в приведенном выше коде): Stack *Cell = new Stack(); - вы выделяетеодна ячейка, которая помещается в стеке, но тип, который вы используете для нее , равен Stack.

Вместо этого я бы сделал что-то подобное:1020 *

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>.Стек, содержащий несколько узлов, имеет смысл - стек, содержащий несколько стеков, на самом деле этого не делает.

0 голосов
/ 25 ноября 2010

Вместо этого вы можете просто написать шаблонный класс и написать все эти функции как методы этого класса.Затем они будут использовать те же параметры шаблона, что и класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...