Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 10.09.2020
Сообщений: 11
1

Функция с переменным числом аргументов

11.09.2020, 01:06. Показов 3218. Ответов 2

Author24 — интернет-сервис помощи студентам
Решаю задачи, задача: напишите функцию print_values с переменным числом аргументов, которая для каждого аргумента выводит его тип и значение в поток std::ostream, который ей передан в качестве первого аргумента. Функция должна работать с произвольным числом аргументов.

Указание: для вывода имени типа нужно использовать std::type_info::name.
Например, вызов функции
C++
1
print_values(std::cout, 0, 3.5, "Hello");
Должно вывести примерно так:
Код
i: 0
d: 3.5
PKc: Hello
Вот, что получилось у меня:
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
#include <iostream>
#include <typeinfo> 
 
using namespace std;
 
 
int print_values(){ //без параметров
    
    return 0;
}
 
int print_values(std::ostream& os){ //только поток
    return 0;
}
 
template <typename T>
void print_values(std::ostream& os,T value){
    os << typeid(value).name() << ": "<< value<<std::endl;
    os << '\n';
    return;
}
 
template<typename T, typename... Args> // Args — это пакет параметров шаблона
void print_values(std::ostream& os, T value, Args... arg) 
{
    os << typeid(value).name() << ": "<<value << std::endl;
    print_values(os,arg...); // рекурсия
}
 
int main()
{
 
  print_values(std::cout,8,6,56,987,678,"4567");
  std::cin.get();
  return 0;
}

Где только можно проверила, везде работает, а где надо, показывает ошибку:
Код
Compilation error
main.cpp: In function ‘bool compare(std::__cxx11::string, std::__cxx11::string)’:
main.cpp:48:59: error: no matching function for call to ‘remove_if(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)’
     s1.erase(std::remove_if(s1.begin(), s1.end(), &isspace), s1.end());
                                                           ^
In file included from /usr/include/c++/6/algorithm:62:0,
                 from main.cpp:34:
/usr/include/c++/6/bits/stl_algo.h:926:5: note: candidate: template<class _FIter, class _Predicate> _FIter std::remove_if(_FIter, _FIter, _Predicate)
     remove_if(_ForwardIterator __first, _ForwardIterator __last,
     ^~~~~~~~~
/usr/include/c++/6/bits/stl_algo.h:926:5: note:   template argument deduction/substitution failed:
main.cpp:48:59: note:   couldn't deduce template parameter ‘_Predicate’
     s1.erase(std::remove_if(s1.begin(), s1.end(), &isspace), s1.end());
                                                           ^
main.cpp:49:59: error: no matching function for call to ‘remove_if(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)’
     s2.erase(std::remove_if(s2.begin(), s2.end(), &isspace), s2.end());
                                                           ^
In file included from /usr/include/c++/6/algorithm:62:0,
                 from main.cpp:34:
/usr/include/c++/6/bits/stl_algo.h:926:5: note: candidate: template<class _FIter, class _Predicate> _FIter std::remove_if(_FIter, _FIter, _Predicate)
     remove_if(_ForwardIterator __first, _ForwardIterator __last,
     ^~~~~~~~~
/usr/include/c++/6/bits/stl_algo.h:926:5: note:   template argument deduction/substitution failed:
main.cpp:49:59: note:   couldn't deduce template parameter ‘_Predicate’
     s2.erase(std::remove_if(s2.begin(), s2.end(), &isspace), s2.end());
Что не так?

Добавлено через 21 минуту
Кто наткнется на эту задачу в процессе обучения, удалите
C++
1
using namespace std;
и все заработает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2020, 01:06
Ответы с готовыми решениями:

Рекурсивная функция с переменным числом аргументов на С++98
Добрый день! Столкнулся с проблемой построения иерархического дерева, состоящего из указателей на...

Шаблонная функция с переменным числом аргументов
Сабж. Каким образом можно запретить использование шаблонной функции, если тип одного из аргументов...

Функция с переменным числом аргументов (через шаблоны)
Доброго времени суток! Встал вопрос с реализацией такой функции. template&lt;typename... Args&gt;...

Функции с переменным числом аргументов
на пример sum(2,56,515,-23.65,548)?

2
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
11.09.2020, 01:41 2
Цитата Сообщение от VikaL0 Посмотреть сообщение
Кто наткнется на эту задачу в процессе обучения, удалите
Никаких ошибок в вашем коде нет. Непонятно только, почему две первые версии вашей функции вдруг зачем-то возвращают некий int.

Если вы использовали какой-то странный компилятор/окружение, то его нужно детально описывать. Без этого ваш рассказ малополезен.

Цитата Сообщение от VikaL0 Посмотреть сообщение
удалите
C++
1
using namespace std;
и все заработает.
Очевидно те, кто писал тестовую "обвязку" для студенческого кода, не приняли во внимание, что в стандартной библиотеке есть несколько функций isspace: в <cctype> и в <locale>.

Но за using namespace std; надо в любом случае бить по рукам.
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
11.09.2020, 03:23 3
Если есть возможность использовать c++17, можно так:

C++
1
2
3
4
5
template<class... Args>
void print_value(std::ostream& os, Args... args)
{
    ((os << typeid(args).name() << " : " << args << '\n'), ...);
}
1
11.09.2020, 03:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2020, 03:23
Помогаю со студенческими работами здесь

Шаблоны с переменным числом аргументов
Написал шаблон функции с переменным числом аргументов которая считает сумму своих аргументов....

Функции с переменным числом аргументов
Ребята, подскажите пожалуйста, где можно обстоятельно и подробно прочитать про использовании в C++...

Написать функцию с переменным числом аргументов
Помогите понять, что от меня хотят-то вообще. Мне нужно: объявить функции в соответствии с...

GCC и функции с переменным числом аргументов
Писал мини приложение в студии для работы с векторами, один из методов просто получает сколько...

Инициализация std::tuple переменным числом аргументов
Добрый вечер. Мне нужно инициализировать объект std::tuple, который является членом некоторого...

Шаблон с переменным числом аргументов, и возвращаемое значение функции
Здравствуйте! Использую С++11. Хочу возвращать элементы кортежа пытаюсь так, auto...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru