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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметры в вариативном шаблоне функции пересылки 
V
    Опции темы
georain
Дата 18.1.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Для избежания копирования объектов в функциях пересылки, вместе с возможностью передать все возможные типы используется примерно следующий код:
Код

template <typename T>
void external(typename TypeTraits<T>::ParameterType prm){
    internal(prm);
};

Как сделать тоже самое для вариативного шаблона?

Код

template <typename... Types>
void external( ??? );

PM MAIL   Вверх
bsa
Дата 18.1.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



а разве такое бывает? Там где надо несколько вариантов шаблона с разными параметрами, используют множество объявлений этих шаблонов (с одним параметром, двумя, тремя,...).
PM   Вверх
djamshud
Дата 18.1.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

Репутация: 8
Всего: 39



По-моему, никак. Я бы просто передавал кучу variant-ов в func(...).

Добавлено через 30 секунд
Хотя нет. Я бы вообще такого не стал делать.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
georain
Дата 18.1.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(bsa @ 18.1.2010,  16:31)
а разве такое бывает? Там где надо несколько вариантов шаблона с разными параметрами, используют множество объявлений этих шаблонов (с одним параметром, двумя, тремя,...).

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

Но вот я тут немного ступил, проблема не в вариативном шаблоне, а в концепции функции пересылки.
Мой пример работает только если типы параметров заранее известны (кстати вопрос всё равно остается открытый, как к набору параметров добавить ссылочный тип, с учетом того, что в наборе уже могут быть ссылки).

Конкретно моя проблема  пришла к следующей, есть:
Код

template <typename T>
void external(const T & prm){
    internal( prm );
};

Все отлично, пока не попытаться передать ссылку, т.е. если требуется вызвать например internal(Class & cl).

В Sutter 2002, 10.6, где обсуждаются функции пересылки этот вопрос почему-то не поднимался. А у Александреску проблема решается как в примере в первом после, но там заранее известны типы аргументов. Но чаще они не известны. Больше я пока ничего не нашел.

Это сообщение отредактировал(а) georain - 18.1.2010, 17:05
PM MAIL   Вверх
maxim1000
Дата 18.1.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



глубоко в этом вопросе не разбирался, но уж больно часто r-value references упоминаются в связи с "perfect forwarding", которое, если я не ошибаюсь, как раз и описывает эту проблему


--------------------
qqq
PM WWW   Вверх
georain
Дата 19.1.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(maxim1000 @  18.1.2010,  19:02 Найти цитируемый пост)
часто r-value references упоминаются в связи с "perfect forwarding", которое, если я не ошибаюсь, как раз и описывает эту проблему 

Спасибо! "Perfect forwarding" в самом деле описывает и решает эту проблему, и даже больше!

Теперь в новом стандарте можно будет писать (в gcc-4.4 уже можно) так:
Код

template <typename T>
void external(T && prm){
    internal( std::forward<T>(prm) );
};

и так
Код

template <typename... Types>
void external(Types &&... prms){
    internal( std::forward<Types...>(prms...) );
};


Это сообщение отредактировал(а) georain - 19.1.2010, 13:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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