Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2012, 16:33   #1
streimer
 
Регистрация: 24.09.2012
Сообщений: 3
Лампочка Указатели в шаблонах (C++)

Добрый день.
Внезапно возникла проблема (или скорее непонимание) с реализацией одной шаблонной функции на C++. Суть ее заключается в следующем: нужно написать функцию, принимающую в качестве аргументов указатели на некоторые элементы массива, а в результате переставляющая эти элементы. Без особых проблем я накатал вот такое:
Код:
template <typename T>
void swap (const T first, const T second)
{
	T temp = new int;
	*temp = *first;
	*first = *second;
	*second = *temp;
}
Но, как не сложно увидеть, она будет работать только с массивами целых чисел. А вот как ее приспособить к произвольному типу я не знаю. На строчки типа
T temp;
T temp = new (*T);
(вместо инициализации temp'а в вышеприведенном коде) компилятор ругается. А больше идей и нет. Может кто-нибудь знает возможно ли справиться с такой проблемой?
Объявление шаблонной функции менять нельзя, только реализацию.

Пример использования функции:
Код:
int main() {
	int a[5] = {3, 2, 1, 4, 5};
	swap(a, a+2); //поменяет 3 и 1
	return 0;
}
streimer вне форума Ответить с цитированием
Старый 24.09.2012, 17:49   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Это Вам задали, или по какой причине нельзя менять определение? Можно ли писать дополнительные шаблоны, вроде
Код:
template <typename T>
struct unptr;

template <typename T>
struct unptr<T *> {
  typedef T type;
}
И тогда
Код:
template <typename T>
void swap (const T first, const T second)
{
  typename unptr<T>::type temp;
  temp = *first;
  *first = *second;
  *second = temp;
}
?
netrino вне форума Ответить с цитированием
Старый 24.09.2012, 22:17   #3
streimer
 
Регистрация: 24.09.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Это Вам задали, или по какой причине нельзя менять определение?
Да, определение должно было оставаться таким же, но про дополнительные шаблоны не было указано ни слова. Поэтому думаю этот вариант решения подойдет. Спасибо!

UPD: Но еще бы хотелось, чтобы эта штука работал и с вектором (с итераторами в виде параметров), но вот тут компилятор опять ругается
Можно ли как-нибудь дополнить ваш вариант, чтобы он работал и в случаях типа:
Код:
vector<int> b(5, 1);
swap(b.begin(), b.begin()+2);
?
streimer вне форума Ответить с цитированием
Старый 24.09.2012, 23:38   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не уверен, можно ли Вам пользоваться всеми средствами стандартной библиотеки, но в "модуле" iterator определён тип iterator_traits, который позволяет извлечь данные о типе элемента из итератора (тех, что поддерживают iterator_traits), включая указатели.
Код:
#include <iterator>
// ...
template <typename T>
void swap (const T first, const T second)
{
  typename iterator_traits<T>::value_type temp = *first;
  *first = *second;
  *second = temp;
}
Если нельзя, тогда можно изменить предложенное мною определение unptr следующим образом:
Код:
template <typename T>
struct unptr {
  typedef typename T::value_type type;
};

template <typename T>
struct unptr<T *> {
  typedef T type;
};
netrino вне форума Ответить с цитированием
Старый 25.09.2012, 00:07   #5
streimer
 
Регистрация: 24.09.2012
Сообщений: 3
По умолчанию

netrino
Первый способ, пожалуй, более универсальный. Им и воспользуюсь.
Еще раз спасибо.
streimer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблемы с operator = в шаблонах monnzz Общие вопросы C/C++ 6 11.05.2012 20:58
django-php: PHP в шаблонах Django rei_desu PHP 0 07.08.2011 05:16
PHP код в шаблонах CMS MrakSPb PHP 7 03.08.2010 15:16
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39