Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/27: Рейтинг темы: голосов - 27, средняя оценка - 4.63
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26

Переменное число аргументов

14.08.2012, 14:11. Показов 5654. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
РАСПАКОВКА
есть ли способы кроме рекурсии и передачи как списка инициализации?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2012, 14:11
Ответы с готовыми решениями:

Переменное число аргументов
Есть такой код. Хочу сделать, чтобы operator() принимал переменное число аргументов переменных типов. Т.е. передаём template<int,...

Передача в функцию переменное кол-во аргументов
Здравствуйте, Пытаюсь понять, как передать в функцию переменное кол-во аргументов и грубо говоря считать их в функции. Делаю вот так:...

Переменное количество аргументов в функции ( зацикливание )
Здравствуйте. Подскажите пожалуйста как правильно огранизировать доступ к каждому параметру. Заранее спасибо. Вот код: #include...

32
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2012, 12:59
Лучший ответ Сообщение было отмечено как решение

Решение

Студворк — интернет-сервис помощи студентам
Pure, Как вариант.

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
25
26
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/for_each.hpp>
#include <tuple>
#include <iostream>
 
template<typename T>
struct func
{
   func(const T& t):
      seq(t)
   {
   }
   template<typename U>
   void operator () (const U&)
   {
      std::cout << std::get<U::value>(seq) << std::endl;
   }
   T seq;
};
 
int main()
{
   auto t = std::make_tuple(1, 2, "hello", 5.6);
   boost::mpl::range_c<int, 0, std::tuple_size<decltype(t)>::value> range;
   boost::mpl::for_each<decltype(range)>(func<decltype(t)>(t));
}
Можно и не писать функтор, но что-то я плохо дружу с бустовскими лямбдами(

Добавлено через 41 минуту
~OhMyGodSoLong~, Это все хорошо, но boost::any довольно неудобен в использовании, все-таки any_cast постоянно юзать не очень радует + это все-таки абсолютно разные вещи, std::vector<boost::any> вектор объектов, в то время как T... раскрывается в типы напрямую, то есть такое с any не напишешь

C++
1
2
3
4
5
6
7
8
9
10
11
template<typename T, class... Args>
std::vector<T> create_vector(const Args&... args)
{
    return std::vector<T>(args...);
}
 
int main()
{
    const auto& v1 = create_vector<int>(5);
    const auto& v2 = create_vector<int>(5, 4);
}
А чтобы сделать так, чтобы аргументы хранились как ты сказал и удобно использовались нужна рефлексия
4
15.08.2012, 13:30

Не по теме:

Цитата Сообщение от Pure Посмотреть сообщение
давай вынесем твои поиски в этом направлении в твой блог
А Смысл?Я всего лишь написал вчера предположительную реализацию по твоему заданию (верней как понял его да ещё и без VA , сам же я стороник cstdarg). Будет время подумаю ещё...

0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
15.08.2012, 13:44  [ТС]
ForEveR, т.е. итоговое решение выглядит так

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
25
26
27
28
29
30
31
32
33
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/for_each.hpp>
#include <tuple>
#include <iostream>
 
template<typename T>
struct func
{
   func(const T& t):
      seq(t)
   {
   }
   template<typename U>
   void operator () (const U&)
   {
      std::cout << std::get<U::value>(seq) << std::endl;
   }
   T seq;
};
 
 
template<class... Args>
void consume_done (Args... args)
{
   std::tuple<Args...> t{args...};
    boost::mpl::range_c<int, 0, std::tuple_size<decltype(t)>::value> range;
   boost::mpl::for_each<decltype(range)>(func<decltype(t)>(t));
  
} 
int main()
{  
  consume_done("5555",6.7,'Z',67);  
}
чтож, некрасиво выглядит, но работает. спасибо за то что потратил время и поморочился.

луета конечно какая то. перепаковка тупла в рендж. скрестили бы сразу и то и другое в стандарте.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
15.08.2012, 13:53
ForEveR, я и не говорил, что оно замена статическому варианту. Ваш вариант для Pure сломается же ещё на стадии компиляции, если в кортеж засунуть что-то, что ostream не умеет выводить. Для полного счастья ещё бы отделить сам функтор от вот этого T seq;, но что-то у меня пока не выходит.

Для удобной динамической типизации надо рефлексию, а в Си++ её нет и не будет, пока темлейты будут кушаться при компиляции. Ну и, естественно, это потребует переделывать механику вызова функций.

Ну, и это только подтверждает, что за этими всеми плюшками надо идти в динамические языки. Или в Хаскелл — у него выводилка типов достаточно умная.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2012, 15:19
Pure, Ну тут нет перепаковки. Рейндж используется исключительно для индексов.
~OhMyGodSoLong~, Ну да. Слом на этапе компиляции - это не так уж и плохо. Можно конечно SFINAE задействовать как-нибудь... Ща поковыряюсь ради интереса. Ну рефлексию-то очень даже предлагают ввести (говорил Страуструп что-то на эту тему). А так конечно с динамическими языками не сравнится.

Добавлено через 1 час 25 минут
Ну как-то так, но не сомневаюсь что можно и проще.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/for_each.hpp>
#include <tuple>
#include <iostream>
 
template<typename T, size_t Idx, typename Enabled = void>
struct is_printable
{
   static constexpr bool value = false;
};
 
template<typename T, size_t Idx>
struct is_printable<T, Idx,
   typename std::enable_if<std::is_lvalue_reference<decltype(std::cout << std::get<Idx>(T()))>::value>::type>
{
   static constexpr bool value = true;
};
 
template<typename T>
struct func
{
   func(const T& arg):
      seq(arg)
   {
   }
 
   template<typename U, typename Enabled = void>
   struct func_impl
   {
      template<typename Seq>
      static void apply(const Seq& seq) { }
   };
 
   template<typename U>
   struct func_impl<U, typename std::enable_if<is_printable<T, U::value>::value>::type>
   {
      template<typename Seq>
      static void apply(const Seq& seq) { std::cout << std::get<U::value>(seq) << std::endl; }
   };
 
   template<typename U>
   void operator () (const U&)
   {
      func_impl<U>::apply(seq);
   }
 
   T seq;
};
 
struct A
{
};
 
struct B
{
};
 
int main()
{
   auto t = std::make_tuple(A(), 1, 2, "hello", B(), 5.6);
   boost::mpl::range_c<int, 0, std::tuple_size<decltype(t)>::value> range;
   boost::mpl::for_each<decltype(range)>(func<decltype(t)>(t));
}
http://liveworkspace.org/code/... b4bc39897b
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
15.08.2012, 15:52  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

хотя ерунда. сейчас опять. std::get<1> std::get<2>.

снимаю задачу.

из всего диалога какие выводы напросились.

1. если на этапе компиляции есть все исходные данные то работая std::get можно спокойно окучивать кортеж, который принял переменный список.
2. индексации по кортежу нормальной не было сделано. достаточно посмотреть монстрокод нужный для прохода. возникает вопрос а не зарыта ли глубоко в буст рекурсия? Если нет то что мешало сделать индексы кортежу.

будь мужиком ставь лайк
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2012, 16:16
Pure, Зарыта конечно. Шаблонное метапрограммирование на С++ в любом случае сводится к рекурсивной раскрутке шаблонов.
for_each к примеру.
mpl::for_each
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
template< bool done = true >
struct for_each_impl
{
    template<
          typename Iterator
        , typename LastIterator
        , typename TransformFunc
        , typename F
        >
    static void execute(
          Iterator*
        , LastIterator*
        , TransformFunc*
        , F
        )
    {
    }
};
 
template<>
struct for_each_impl<false>
{
    template<
          typename Iterator
        , typename LastIterator
        , typename TransformFunc
        , typename F
        >
    static void execute(
          Iterator*
        , LastIterator*
        , TransformFunc* 
        , F f
        )
    {
        typedef typename deref<Iterator>::type item;
        typedef typename apply1<TransformFunc,item>::type arg;
    
        // dwa 2002/9/10 -- make sure not to invoke undefined behavior
        // when we pass arg.
        value_initialized<arg> x;
        aux::unwrap(f, 0)(boost::get(x));
        
        typedef typename mpl::next<Iterator>::type iter;
        for_each_impl<boost::is_same<iter,LastIterator>::value>
            ::execute( static_cast<iter*>(0), static_cast<LastIterator*>(0), static_cast<TransformFunc*>(0), f);
    }
};
 
} // namespace aux
 
// agurt, 17/mar/02: pointer default parameters are necessary to workaround 
// MSVC 6.5 function template signature's mangling bug
template<
      typename Sequence
    , typename TransformOp
    , typename F
    >
inline
void for_each(F f, Sequence* = 0, TransformOp* = 0)
{
    BOOST_MPL_ASSERT(( is_sequence<Sequence> ));
 
    typedef typename begin<Sequence>::type first;
    typedef typename end<Sequence>::type last;
 
    aux::for_each_impl< boost::is_same<first,last>::value >
        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_cast<TransformOp*>(0), f);
}
 
template<
      typename Sequence
    , typename F
    >
inline
void for_each(F f, Sequence* = 0)
{
    for_each<Sequence, identity<> >(f);
}
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.08.2012, 16:35
Цитата Сообщение от Pure Посмотреть сообщение
2. индексации по кортежу нормальной не было сделано. достаточно посмотреть монстрокод нужный для прохода. возникает вопрос а не зарыта ли глубоко в буст рекурсия? Если нет то что мешало сделать индексы кортежу.
ты не понимаешь в чем разница в разборе динамических и статических кортежей
"обыкновенного" статического перебора кортежа просто не может быть
2
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
15.08.2012, 16:51  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
Pure, Зарыта конечно.
тогда в чем отличие от самого первого поста? столько строк и все напрасно-результат такой же
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2012, 16:51
Pure, В том, что используются готовые алгоритмы. Нерекурсивных вариантов нет и быть не может.
0
15.08.2012, 16:53  [ТС]

Не по теме:

alex_x_x, скажи а у тебя когда нибудь было повреждено ухо?

0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.08.2012, 20:30
Pure, нет а шо?
0
15.08.2012, 23:42  [ТС]

Не по теме:

alex_x_x, да просто был у нас один парень.думали ухо у него повреждено. а потом выяснилось что все нормально с ухом было. чем то по стилю на тебя похож. покажи фотку

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2012, 23:42

Программа должна читать из консоли переменное количество аргументов и выводить их
Программа должна читать переменное кол-во аргументов из командной строки и выводить их в виде &quot;Hello, arg!&quot; . Ф-я main()...

Переменное число параметров шаблона
Здоровеньки булы. Не уверен, что название темы точно отражает суть вопроса. Есть заготовка шаблонного делегата, параметры которого -...

Переменное число параметров функции - трабл с int
Функция - выводит среднее арифметическое своих аргументов. Рабочий пример с double: #include &lt;cstdarg&gt; #include &lt;iostream&gt; ...

Переменное число аргументов
Доброго времени суток! В чем различия этих двух методов по получению аргументов? void test1(int a, ...) { int *b = &amp;a; ...

Необходимо написать функцию, которая обрабатывает переменное число аргументов
Создать скрипт, содержащий функцию с переменным числом аргументов. Функция должна выполнять следующее : 1.Подсчитать сумму всех...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru