Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 33

Приставучая формальная ошибка - "пакет параметров должен раскрываться в этом контексте"

01.06.2019, 15:40. Показов 6462. Ответов 3

Студворк — интернет-сервис помощи студентам
Допустим есть такая простая функция для примера(не работает):
C++
1
2
3
4
5
6
    template<typename Val, typename... Types>
    void multiply(Val val, Types& ... args)
    {
        ((args *= val));// каждое значение в пакете параметров умножить на val
                              //ошибка - "args": пакет параметров должен раскрываться в этом контексте. 
    }
Почему я должен раскрывать пакет параметров, когда я не хочу с ним что-то делать. Я просто хочу умножить его значения.

Я нашел 2 возможности исправить эту проблему, не добавляя дополнительных действий в сторонних функциях.

Первая:
C++
1
2
3
4
5
6
7
8
    template<typename... T>
    void voidf(T const& ...) {  }
 
    template<typename Val, typename... Types>
    auto multiply(Val val, Types& ... args)
    {
        voidf((args *= val)...);
    }
Использование пустой функции, чтобы куда-то раскрыть параметры.(Я не знаю на сколько это хорошо/плохо,
делает ли какую-либо доп работу)
Второе решение:
C++
1
2
3
4
5
    template<typename Val, typename... Types>
    void multiply(Val val, Types& ... args)
    {
        ((args *= val) | ...); //какое-либо пустое действие, чтобы компилятор отстал
    }
Есть ли какое-либо адекватное решение этой проблемы? Или это косяк компилятора?
Может это глупый вопрос, но я только новичок в шаблонной магии.
Заранее спасибо за ответы.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2019, 15:40
Ответы с готовыми решениями:

Материал должен раскрываться в блоге
Друзья, добрый день. Столкнулся с проблемой. Необходимо сделать так, чтобы страница выглядела как блог категории. Т.е. идет заголовок,...

Ошибка в XML: не допускается употребление элемента в этом контексте
Доброго всем дня! Есть схема &lt;?xml version=&quot;1.0&quot;?&gt; &lt;xs:schema xmlns:xs=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt; ...

разбирался что такое конструктор чтобы закрепить написал код ,в нём ошибка : пишет переменная не существует в этом контексте.
Доброго времени суток всем , начал учиться программированию , разбирался что такое конструктор чтобы закрепить написал код ,в нём ошибка :...

3
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
01.06.2019, 15:56
Лучший ответ Сообщение было отмечено НемецкийКот как решение

Решение

C++
1
2
3
4
5
template<typename Val, typename... Types>
void multiply(Val val, Types&& ... args)
{
    ((args *= val), ...);
}
1
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 33
01.06.2019, 16:43  [ТС]
Спасибо, я аж не знал, что так можно было. Ссылку на r-value здесь не надо, смысл умножать временные объекты.

Добавлено через 22 минуты
Напоследок, такое законно делать, или зря я научился фиче с запятой?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<size_t... I>
struct Indices
{
};
 
template<typename Cont, size_t... Idxs>
void print_by_indices(Cont const& cont, Indices<Idxs...>)
{
    ((cout << std::get<Idxs>(cont) << " "), ...); //формальное раскрытие
}
 
int main()
{
    std::array arr = { 1, 7 , 123 };
    print_by_indices(arr, Indices<0, 2>());
}
Или это говнокод?
Стоит ли использовать такое формальное раскрытие на практике?
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
01.06.2019, 17:10
Цитата Сообщение от НемецкийКот Посмотреть сообщение
Или это говнокод?
Стоит ли использовать такое формальное раскрытие на практике?
Встречается такое. Примеры есть на cppreference.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2019, 17:10
Помогаю со студенческими работами здесь

Работа с куки и ошибка "В этом контексте запрос недоступен"
public byte Lang() { byte lang = 0; // &quot;en&quot; if (Request.Cookies != null) { ...

Элемента нет в этом контексте
Здравствуйте! Я новичок в C#. Пытаюсь добавить таймер к коду. Прочитал в интернете что это делается так: Timer tu = new Timer(); ...

элемент tb не существует в этом контексте
Всем привет.Начал изучать C# и столкнулся с проблемой - не выводятся цифры в TextBox.Пишет - &quot;элемент tb не существует в этом...

Файлы параметров не найдены в этом проекте.Добавьте фалй параметров и повторите попытку
хочу установить параметры приложения (applicationsettings) для формы, а именно: хочу сделать так, чтобы при наведении курсор default...

Использование функций CoInitialize и CoUnitialize в контексте глобальных параметров
Привет, Интересует вопрос использования функций (CoInitialize и CoUnitialize) в контексте инициализации и уничтожения глобальных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru