Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
#1

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

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

РАСПАКОВКА
есть ли способы кроме рекурсии и передачи как списка инициализации?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2012, 14:11     Переменное число аргументов
Посмотрите здесь:

Дано целое число. Вывести его строку-описание вида «отрицательное чет-ное число», «нулевое число», «положительное нечетное число» и т. д. C++
С++ проверка аргументов C++
передача аргументов C++
Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? C++
C++ Можно ли в цикле for устанавливать переменное значение инициализатора?
Переменное число параметров функции - трабл с int C++
C++ Программа должна читать из консоли переменное количество аргументов и выводить их
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.08.2012, 18:10     Переменное число аргументов #2
stdarg.h
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.08.2012, 18:47  [ТС]     Переменное число аргументов #3
Jupiter, va_list и прочее не в счет. можно удалить. я уж прочитал что нельзя особо использовать. в других языках это полноценный класс и с ним можно работать. в ++ пока не так
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.08.2012, 19:45     Переменное число аргументов #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Pure, tuple может помочь. или typelist как у Александреску. А так, развертка шаблонов с переменным числом аргументов возможна только через рекурсивные вызовы.
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.08.2012, 20:55  [ТС]     Переменное число аргументов #5
ForEveR, я все таки имел ввиду следущее

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
function test (...Arg:Array):void {
                    
                trace(Arg.indexOf("privet"));               
                Arg.sort();             
                trace(Arg); 
                var ss:String= Arg.join("___");
                trace(ss);
                
                }
            
            test("ghbdtn", 56, "yyy", 67, "privet", "AAAA");
выход будет
4
56,67,AAAA,ghbdtn,privet,yyy
56___67___AAAA___ghbdtn___privet___yyy
в AS3 этот самый переменный список аргументов является полноценным классом с кучей методов и неплохими возможностями использования.
это все к тому что увидев возможность задавать переменный список аргументов и при этом все это присваиватеся некой "переменной", подумалось "а вдруг". Но нет. Пока нет для С++. Хотя и так предостаточно возможностей понадобавляли
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.08.2012, 21:03     Переменное число аргументов #6
Pure, Да, почитай документ на эту тему. https://github.com/boostcon/cppnow_p...ith_tuples.pdf
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.08.2012, 21:06  [ТС]     Переменное число аргументов #7
ForEveR, да кортежи похожи на это. но конкретно зарядить список перменных аргументов в кортеж внутри тела функции сможешь? Я что то нынче поковырялся и забросил. Если появиться желание и это можно сделать то накидай плиз. будет полезно посмотртеь думаю.
что то вроде
C++
1
2
3
4
5
6
7
8
9
10
template <typename ...Arg> void test (Arg ... arg)
{
 
auto tup =  std::make_tuple (arg....);
 
int siz = sizeof...(Arg);
 
for(int i=0;i<siz;++i)
std::cout<<std::get<i>(tup);
}
сразу скажу что это по любому не соберется хотя бы потому что get требует константу, ну и прочее прочее прочее
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.08.2012, 21:27     Переменное число аргументов #8
Да дело всё в том, что в Си++ в рантайме нет шаблонов. Если их надо иметь, то это (по идее) надо городить какую-то штуку, которая (рекурсивно с помощью шаблонной магии во время компиляции) соберёт все аргументы в какой-нибудь vector<Variant>, а потом уже в функции разбираться с этим вектором и сохранёнными внутри метками типов.

Хотя и шаблоны не могут при определении своих же шаблонных параметров использовать свои же шаблонные параметры. Так что я даже сомневаюсь, что это можно сделать.
-=ЮрА=-
14.08.2012, 21:34
  #9

Не по теме:

Pure, можешь для "тупого Юры", объяснить что ты потом со своим списком и числом аргументов хочешь делать?(тобишь на кой оно тебе надо и как хочешь чтоб работало, в тёх словах нарисуй)

ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.08.2012, 21:50     Переменное число аргументов #10
Pure, Ну вот тут довольно интересно к примеру.
http://stackoverflow.com/questions/1...les-in-c11-stl
OhMyGodSoLong
14.08.2012, 22:34
  #11
-=ЮрА=-
Заблокирован
Автор FAQ
15.08.2012, 00:47     Переменное число аргументов #12
Вот то что вышло у меня
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
#include <vector>
#include <string>
#include <sstream>
#include <typeinfo>
#include <iostream>
using namespace std;
 
struct Argument
{
    string stype;
    string value;
};
 
class CArgList
{
private:
    int i;
    vector<Argument> vec;
    vector<Argument>::iterator it;
public:
    CArgList()
    {
        i = 0; 
        vec.empty();
    }
    template <typename T>
    bool operator <<(T arg);
    bool operator >>(Argument &pArg);
};
 
template <typename T>
bool CArgList::operator <<(T arg)
{
    Argument pArg;
    stringstream ss;ss<<arg;
    pArg.stype    = typeid(T).name();
 
    bool flag = true;
    if(ss>>pArg.value)
        vec.push_back(pArg);
    else
        flag = false;
    return flag;
}
 
bool CArgList::operator >>(Argument &pArg)
{
    bool flag = true;
    if(vec.begin() + i < vec.end())
    {
        it = vec.begin() + i;
        pArg = (*it);
        i  = i + 1;
    }
    else
        flag = false;
    return flag;
}
 
int main()
{
    CArgList pArgList;
    pArgList<<23;
    pArgList<<":";
    pArgList<<37;
    pArgList<<"YurA done it";
    Argument pArg;
    while(pArgList>>pArg)
        cout<<pArg.stype<<" - "<<pArg.value<<endl;
    return 0;
}
Единственное с перегрузкой << не до конца доработал, но в целом мне нравиться, да и кода мало
http://liveworkspace.org/code/2e6b05...068d853e89f43f
Отработка
i - 23
PKc - :
i - 37
PKc - YurA
Миниатюры
Переменное число аргументов  
Jupiter
15.08.2012, 00:59
  #13

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что ты потом со своим списком и числом аргументов хочешь делать?
-=ЮрА=-, резонный вопрос, только лучше вы бы на этом и остановились

Цитата Сообщение от Pure Посмотреть сообщение
в AS3
почему не пишешь на AS3 ?! тратишь время на какие-то плюсы со статической типизацией!

alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.08.2012, 01:13     Переменное число аргументов #14
Цитата Сообщение от Pure Посмотреть сообщение
в AS3 этот самый переменный список аргументов является полноценным классом с кучей методов и неплохими возможностями использования.
это все к тому что увидев возможность задавать переменный список аргументов и при этом все это присваиватеся некой "переменной", подумалось "а вдруг". Но нет. Пока нет для С++. Хотя и так предостаточно возможностей понадобавляли
мне кажется ты не понимаешь разницы между динамическими кортежами (run-time) в AS3 и статическими кортежами (compilation-time) в с++
те к примеру AS3 скорее всего ближе контейнер с stl-вским алгоритмом (с лямбдой)

те то что у тебя в AS3 написано ближе к std::vector<boost::any>, чем к tuple'ам
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.08.2012, 08:16     Переменное число аргументов #15
-=ЮрА=-, Какое отношение имеет к шаблоном с переменным кол-вом аргументов?
Да и какой смысл было писать это, когда есть boost::any или что-нибудь в этом роде?
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
15.08.2012, 09:18  [ТС]     Переменное число аргументов #16
Цитата Сообщение от alex_x_x Посмотреть сообщение
те то что у тебя в AS3 написано ближе к std::vector<boost::any>, чем к tuple'ам
интересовало не сравнение как таковое меж статическими и динамическими кортежами
Меня заинтересовала сама возможность удобной обработки переменного количества аргументов. поскольку функции (...)есть уже давно, а тут вдруг появилось (...Args). Т.е. интересовала сама возможность. Что мешает в ++ сделать function (...Args)? и дать возможность извлекать аргументы без всяких va_list, а работая со встроенным типом ...Arg. Думаю это дело вероятного будущего поскольку например auto не постеснялись ввести и прочие вещи развивающие... удобный интерфейс для пользователя)

-=ЮрА=-, надо сделать нечто вроде такого
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <locale>
 
void consume_done (...Args)
{
Args[0](Args[1]);
}
 
int main()
{
consume_done([](const char* a){setlocale(LC_ALL,"RUS");std::cout<<a\n;}, "Юра данит");
}
давай вынесем твои поиски в этом направлении в твой блог
Изображения
 
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
15.08.2012, 09:23  [ТС]     Переменное число аргументов #17
~OhMyGodSoLong~, приятно..
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.08.2012, 10:55     Переменное число аргументов #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <tuple>
 
template<class... Args>
void consume_done (Args... args)
{
   std::tuple<Args...> tuple{args...};
   std::get<0>(tuple)(std::get<1>(tuple));
}
 
int main()
{
   consume_done ([](const char* a){
                    std::cout<< a << std::endl;
                 }, "Юра данит");
}
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
15.08.2012, 11:44  [ТС]     Переменное число аргументов #19
alex_x_x, ишь ты подишьты, какой упрямы алекс.
это мой косяк. условие не раскрываюшее прелести стандарта. тут этот огород не нужен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void consume_done (void(*p)(const char*),const char* n)
{
   p(n);
}
 
int main()
{
   consume_done ([](const char* a){
                    std::cout<< a << std::endl;
                 }, "Юра данит");
}

попробую сформулировать запрос получше. вейт ми

Добавлено через 26 минут
alex_x_x, ладно сдаюсь, кроме требования константы в std::get<> придраться особо не к чему.
т.е. если будет 10 элементов тупла, и все они нужны то потребуется 10 раз писать get.

ю вин.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2012, 12:14     Переменное число аргументов
Еще ссылки по теме:

C++ Составить функцию, принимающую переменное количество параметров
Переменное число параметров шаблона C++
C++ Переменное число аргументов
C++ Разработать функцию, возвращающую сумму остатка от деления первого и второго аргументов на заданное число
Переменное количество аргументов в функции ( зацикливание ) C++

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.08.2012, 12:14     Переменное число аргументов #20
Хотя мне тоже не особо понятно, зачем вариадические темплейты сделали такими. Хотя, в принципе, догадываюсь: итеративный интерфейс обработки вариадических параметров потребовал бы
  • или перепиливания всего интерфейса вызова функций, чтобы они при вызове таскали с собой типы и их количество;
  • или же сделал бы возможными обращения ко всяким сотым аргументам, когда фактически передано три (это ваш get<> с переменной) — а это ломает напрочь исходную задумку сделать это хоть сколь-нибудь безопаснее обычных va_list.

Если вам надо передать динамическое количество динамически типизированных аргументов в функцию, то есть проверенный временем способ: затолкайте их в коллекцию и передайте эту коллекцию. std::vector<boost::any> в 200 раз понятнее этой шаблонной магии (да, магия внутри буста, но она хотя бы документирована). Да, конечно, что-нибудь вроде
C++
1
2
3
func(1, 2, 3, VA(4, "5", Object(6, 7, 8)));
// ...
void func(int a, int b, double c, const VarargsVector &varargs) { ... }
выглядит не так круто как
C++
1
2
3
func(1, 2, 3, 4, "5", Object(6, 7, 8));
// ...
void func(int a, int b, double c, Types... varargs) { ... }
Но это хотя бы работает везде (я напомню, что та же Студия вообще не поддерживает полиадические темплейты).

А ещё бонусом этот вариант даёт возможность собирать список аргументов в рантайме. Темплейты при всей своей крутизне такого никогда не смогут.
Yandex
Объявления
15.08.2012, 12:14     Переменное число аргументов
Ответ Создать тему
Опции темы

Текущее время: 17:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru