Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значение по умолчанию параметра шаблона 
:(
    Опции темы
ChipNDale
Дата 12.12.2012, 05:21 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2010

Репутация: нет
Всего: 1



Приветствую.
Хочется реализовать примерно такой функционал: есть шаблон класса, который при создании инициализируется некоторым контейнером и возвращает значения из этого контейнера по некоторым своим правилам. Для хранения элементов будем использовать вектор, при этом хочется иметь возможность инициализировать любым контейнером. Выглядит как-то так:
Код

// FIXME
template<class T, class Iterator /* = std::iterator<std::random_access_iterator_tag, T> */>
class Picker
{
public:
    Picker(const Iterator& first, const Iterator& last) : data_(first, last) { }
    T Pick() { return data_.front(); }

private:
    std::vector<T> data_;
};

int main(int argc, char** argv)
{
    int nums[] = {1, 2, 3, 4, 5};
    std::vector<int> v(nums, nums  + sizeof(nums) / sizeof(*nums));
    
    // FIXME
    //Picker<int> picker(nums, nums  + sizeof(nums) / sizeof(*nums));

    Picker<int, std::vector<int>::const_iterator> picker2(v.begin(), v.end());

    return 0;
}

Не нравится необходимость явно указывать тип итератора при создании объекта. Можно ли как-нибудь корректно уйти от этого?
PM MAIL   Вверх
borisbn
Дата 12.12.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Если не нужно хранить в классе итератор, то достаточно сделать конструктор шаблонным:
Код
template<class T>
class Picker
{
public:
    template< class Iterator > // <------------
    Picker(const Iterator& first, const Iterator& last) : data_(first, last) { }
    T Pick() { return data_.front(); }
private:
    std::vector<T> data_;
};

int main()
{
    int nums[] = {1, 2, 3, 4, 5};
    Picker<int> picker( std::begin( nums ), std::end( nums ) );
    return 0;
}

http://liveworkspace.org/code/3Bl1rp$2


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 12.12.2012, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Вот твой исправленный вариант (на случай если все таки нужно).

Код

#include <vector>
#include <iostream>

template<class T, template<class, class> class C = std::vector, class A = std::allocator<T> >
class Picker
{
   typedef typename C<T, A>::const_iterator const_iterator;
public:
    Picker(const const_iterator& first, const const_iterator& last)
      :data_(first, last) {}
    T Pick() { return data_.front(); }
private:
    C<T, A> data_;
};


int main(int argc, char** argv)
{
    int nums[] = {1, 2, 3, 4, 5};
    std::vector<int> v(nums, nums  + sizeof(nums) / sizeof(*nums));

    // FIXME
    //Picker<int> picker(nums, nums  + sizeof(nums) / sizeof(*nums));
    Picker<int, std::vector> picker2(v.begin(), v.end());
    return 0;
}

PM   Вверх
ChipNDale
Дата 12.12.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2010

Репутация: нет
Всего: 1



borisbn, Вариант с шаблонным конструктором подходит, спасибо.
azesmcar, Спасибо, но в таком варианте все равно присутствует избыточность при использовании класса, от которой хочется уйти.
PM MAIL   Вверх
azesmcar
Дата 12.12.2012, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ChipNDale @  12.12.2012,  10:06 Найти цитируемый пост)
azesmcar, Спасибо, но в таком варианте все равно присутствует избыточность при использовании класса, от которой хочется уйти. 

Какая именно?
PM   Вверх
ChipNDale
Дата 12.12.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2010

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) ChipNDale - 12.12.2012, 10:13
PM MAIL   Вверх
azesmcar
Дата 12.12.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Если внутри всегда будет вектор и итератор в классе храниться не будет, то смысла шаблонизировать класс вообще нет. Достаточно конструктора.
В моем вариант в принципе можно std::vector и не указывать, только тогда между моим вариантом и вариантом borisbn есть одно различие. Конструктор borisbn будет принимать итераторы любого типа, в отличии от моего, который принимает только random access iterator-ы. Ничего не мешает и в моем варианте написать шаблонный конструктор, но раз на данный момент шаблонизировать контейнер не требуется, я бы сделал как показал borisbn. В дальнейшем добавить еще один шаблонный параметр со значением по умолчанию труда не составит.

Это сообщение отредактировал(а) azesmcar - 12.12.2012, 10:25
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.