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

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

Войти
Регистрация
Восстановить пароль
 
csrnsdrfg1
4 / 4 / 0
Регистрация: 30.03.2012
Сообщений: 34
#1

создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++) - C++

04.04.2012, 23:01. Просмотров 802. Ответов 2
Метки нет (Все метки)

Как создать такую? Иными словами, интересует принцип работы (в плане приема аргументов) ф-ии printf (); Ведь в нее можно передавать любое кол-во аргументов. Более того, мне кажется, что в ее определении эти аргументы не имеют определенного типа данных, т.к. пришлось бы использовать операции приведения типа, что влечет за собой неприятные последствия некоторых трансляций (напр. из unsigned в signed), значит, вполне возможно, что передается поток единиц и нулей, которые , после анализа спецификаторов, транслируются в типы. Это так или, что скорее всего, принцип хитрее? Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 23:01     создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++)
Посмотрите здесь:
C++ Функция с переменным кол-вом аргументов char vs int
Множество аргументов неизвестного типа, аналог printf() C++
Шаблон с ограниченным кол-вом типов C++
C++ Вывести слово с максимальным кол-вом символов
C++ Передача неизвестного количества аргументов в функцию, как реализовать?
Строка: удалить лишние пробелы и определить слово с минимальным кол-вом согласных в строке C++
C++ Аргументы неизвестного типа
C++ Ввод числа неизвестного типа
C++ Передача переменного кол-ва аргументов
C++ Значение бесконечности для неизвестного типа
Как сделать шаблон на считывание неизвестного типа данных? C++
C++ Хранение вектора экземпляров шаблонного класса неизвестного типа

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
05.04.2012, 13:28     создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++) #2
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdio.h>
 
/*
 * Определяет макросы, необходимые для перебора необязательных аргументов
 */
#include <stdarg.h>
 
enum ArgType
{
    INT = 1,
    DOUBLE = 2,
    END_OF_LIST = 0
};
 
/* Функция, принимающая неопределённое количество аргументов. Здесь для
 * идентификации аргументов предназначен обязательный массив с их типами, в
 * printf для этого используется форматная строка (в которой с каждым типом
 * сопоставлен спецификатор типа %type)
 */
double average(enum ArgType *args, ...)
{
    double sum = 0.0;
    int count = 0;
    
    /*
     * Указатель на очередной необязательный параметр
     */
    va_list ap;
    
    /*
     * Инициализируем указатель. Поскольку нам известен тип (а значит, и размер)
     * последнего обязательного параметра, то указательн а первый необязательный
     * параметр инициализируется адресом &args + 1
     */
    va_start(ap, args);
    
    /*
     * Перебираем необязательные параметры с учётом форматного массива
     */
    while (args[count] != END_OF_LIST)
    {
        /*
         * Выбираем тип параметра
         */
        switch (args[count])
        {
        case INT:
            /*
             * Макрос va_arg просто интерпретирует sizeof(int) байт, начиная с
             * адреса ap, как значение типа int (в общем случае того типа,
             * который передан макросу вторым аргументом), а также смещает
             * указатель ap на размер этого типа
             */
            sum += (double)va_arg(ap, int);
            
            break;
            
        case DOUBLE:
            sum += va_arg(ap, double);
            
            break;
            
        default:
            va_end(ap);
    
            return sum / count;
            
            break;
        }
        
        ++count;
    }
    
    /*
     * Необходимо завершить перебор необязательных параметров
     */
    va_end(ap);
    
    return sum / count;
}
 
int main(void)
{
    /*
     * В printf вместо args используется форматная строка, в которой вперемешку
     * с обычными символами идут специальные спецификаторы, по одному на каждый
     * стандартный тип
     */
    enum ArgType args[] = {INT, DOUBLE, INT, INT, DOUBLE, END_OF_LIST};
    
    printf("%lf\n", average(args, 1, 2.5, 3, 4, 5.5));
    
    return 0;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.04.2012, 13:46     создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++) #3
А на плюсах круче=)

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>
 
template<typename... Args>
double average_impl(const double res, const size_t count, const Args&... args)
{
   return res / count;
}
 
template<typename... Args, typename T>
double average_impl(const double res, const size_t count, const T& value, const Args&... args)
{
   return average_impl(res + static_cast<double>(value), count, args...);
}
 
template<typename... Args>
double average(const Args&... args)
{
   return average_impl(0.0, sizeof...(args), args...);
}
 
int main()
{
   std::cout << average(1,2,3,4,5) << std::endl;
}
http://liveworkspace.org/code/659860...f8252ad66044cf
Ответ Создать тему
Опции темы

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