стек символов, стек символов, стек целых чисел, стек целочисленных массивов и т. д. - PullRequest
1 голос
/ 26 декабря 2009

Я хочу сделать общий стек, используя шаблоны c ++. Прототип метода push стека задается Void push (t * ptr) Где t - аргумент шаблона. Теперь указатель ptr может указывать на целое число или массив целых чисел, он может указывать на один символ или массив символов, он может указывать на одно двойное число или массив двойных чисел и т. Д. То, что я хочу, я хочу выделить память внутри метода push, если ptr указывает на целое число, то мне нужно выделить память относительно размера целого числа, если ptr указывает на массив целых чисел, то мне нужно выделить память в соответствии с размером массива. Аналогично для других примитивных типов данных Мой вопрос заключается в том, как определить, что этот указатель ptr указывает на массив или простую переменную. Если невозможно определить, что указатель указывает на массив или простую переменную, предложите метод, с помощью которого я могу написать метод push этого стека.

Ответы [ 4 ]

2 голосов
/ 26 декабря 2009

То, что вы предлагаете, не является хорошей идеей - в C ++ невозможно определить, указывает ли указатель на один экземпляр или массив, но эти два должны рассматриваться по-разному.

Лично я бы использовал адаптер std :: stack, который является частью стандарта C ++.

0 голосов
/ 27 декабря 2009

Вы можете использовать частичную специализацию шаблона следующим образом для стека массивов:

template <typename T>
class Stack <T*>
{
 //other stuff
};

Но я не уверен, что ваш компилятор поддерживает это или нет, так как частичная спецификация шаблонов не поддерживается в vc ++ 7.0, более поздняя версия может иметь поддержку.

Насколько я знаю, Linux Linux GNU 8.2 поддерживает его.

0 голосов
/ 26 декабря 2009

ваш компилятор уже позаботится о распределении и копировании. Если вы определяете push так:

push(T item)

Компилятор скопирует элемент для вас, и вы можете поместить его во внутреннее хранилище.

Кроме того, int и int [] - это два разных типа. Если вы хотите специально создать стек, который может принимать T [], вы можете сделать перегрузку push:

push(T[] items)

Я предполагаю, что вы хотите эту функциональность, чтобы вы могли помещать их как отдельные элементы в стек, а не потому, что вам нужен гетерогенный контейнер. В этом режиме вы можете перебирать каждый элемент массива и сохранять его во внутренней памяти.

0 голосов
/ 26 декабря 2009

Невозможно определить размер массива, на который указывает T *, после того как массив «распался» на указатель.

Подумайте о том, чтобы ваш тип стека взял пару указателей, один на первый элемент в массиве и один на последний элемент в массиве. Или используйте перегруженный метод push - один, который принимает один указатель, а другой - один указатель, а size_t сообщает вам, на сколько объектов указано.

И меня немного смущает вопрос, почему у вас есть T * в качестве параметра. Почему бы не взять T, как большинство операций «add» над контейнерами stl? И пока вы занимаетесь этим, знаете ли вы, что std :: stack существует (это «контейнерный адаптер» в stl)? Даже если у вас есть веская причина для его повторной реализации, рекомендуется обратиться к STL за примерами разработки API.

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