Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
3 / 3 / 0
Регистрация: 26.10.2014
Сообщений: 105
1

Variadic Templates - как обращаться к аргументам variadic-функции?

25.08.2015, 14:40. Показов 3462. Ответов 7
Метки нет (Все метки)

Всем привет!
Наверное, рано мне ещё с моими скудными знаниями в это лезть, но, изучив шаблоны и вариадик-функции, я, естественно, горю желанием въехать в variadic-templates. Для этого я пытаюсь написать шаблон простейшей функции, принимающей неопределённое количество аргументов неопределённых типов неоределённого количества(о, Боже!) и выводящей их на экран, но не могу понять, как вообще обращаться к отдельным аргументам такой функции для их последующего вывода. Пытаюсь сделать это с помощью cstdarg:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cstdarg>
 
using namespace std;
 
template<typename... Types>
void Func(int first, Types... Args)
{
  va_list argptr;
  va_start(argptr, first);
  Types temp;
  int size = sizeof... (Types);
  for ( ; size > 0; size-- )
      {
        temp = va_arg(argptr, Types);
        cout << temp << "\n";
      }
}
 
int main()
{
  Func(0, 136, 'A', "SDFGH");
  return 0;
}
Компилятор матерится безбожно практически на каждую строчку.
Будет ли вообще в данном примере работать cstdarg? Если да, то как оформить код правильно? Если нет, то как можно обратиться к отдельному аргументу функции?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2015, 14:40
Ответы с готовыми решениями:

Variadic templates. Как создать алиас на пакет параметров-типов?
Есть у меня 4 типа: F1, F2, F3, F4. Их мне нужно передавать десяток раз в разные места все...

Variadic Templates
проблема только в переводе на русский, обычно это &quot;Шаблоны с переменным числом аргументов&quot; но...

Variadic templates
1. как можно сделать чтобы передавались ссылки на переменные? (с variadic templates) 2. как вообще...

Variadic templates
А как бы так исхитриться, чтобы шаблонная функция, использующая Variadic templates узнала размер...

7
Don't worry, be happy
17172 / 10055 / 1935
Регистрация: 27.09.2012
Сообщений: 25,051
Записей в блоге: 1
25.08.2015, 14:45 2
Цитата Сообщение от Alexey104 Посмотреть сообщение
va_list argptr; va_start(argptr, first);
Ех! Вы путаете variadic templates с сишным ...
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.08.2015, 14:45 3
Цитата Сообщение от Alexey104 Посмотреть сообщение
Пытаюсь сделать это с помощью cstdarg:
variadic templates (c++11) и va_arg (из cstdarg) совершенно разные технологии.
Мешать их ни в коем случае не надо.
На тему шаблонов с переменным кол-вом параметров можешь почитать хотя бы на вики, там и примеры есть.
4
Don't worry, be happy
17172 / 10055 / 1935
Регистрация: 27.09.2012
Сообщений: 25,051
Записей в блоге: 1
25.08.2015, 14:46 4
http://habrahabr.ru/post/101430/
2
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.08.2015, 14:46 5
Alexey104, Не через va_arg. va_list тут вообще ни причем.
Нужно использовать либо шаблонную рекурсию, либо распаковку в самой функции.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void print()
{
}
 
template<typename T, typename... Types>
void print(const T& arg, const Types&... args)
{
   std::cout << arg << std::endl;
   print(args...);
}
 
template<typename... Types>
void Func(const Types&... args)
{
   print(args...);
}
C++
1
2
3
4
5
6
template<typename... Args>
void Func(const Args&... args)
{
    using swallow = int[];
    swallow{0, (std::cout << args << std::endl, 0)...};
}
Зовем просто:
C++
1
Func(136, 'A', "SDFGH");
3
3 / 3 / 0
Регистрация: 26.10.2014
Сообщений: 105
25.08.2015, 14:57  [ТС] 6
Эх...
Тёмный лес для меня все эти рекурсии с кортежами(
Ладно, буду штудировать, будут вопросы - задам в этой теме...
0
Avazart
26.08.2015, 14:51
  #7

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Нужно использовать либо шаблонную рекурсию
Вот интересно, насколько вероятно что компилятор оптимизирует/заинлайнит.

0
DrOffset
26.08.2015, 18:27     Variadic Templates - как обращаться к аргументам variadic-функции?
  #8

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Вот интересно, насколько вероятно что компилятор оптимизирует/заинлайнит.
Даже старый GCC 2.95 инлайнит.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2015, 18:27

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Variadic templates
как можно сделать чтобы функция принимала бесконечное количество объектов std::string? (только их)...

Variadic templates
typedef function&lt;double(double ...)&gt; fun; inline int sum() { return 0; } template...

Result_of + variadic templates
Как здесь можно вывести возвращаемый тип функторов? res_t должен получиться типом которым они ...

Variadic templates fail
Здравствуйте. У меня проблема, нужно реализовать в проекте функционал, который будет использовать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.