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

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

Войти
Регистрация
Восстановить пароль
 
 
Андрей Xomach
8 / 8 / 0
Регистрация: 22.01.2012
Сообщений: 59
#1

Возможно ли реализовать аналог функции Read из Паскаля? - C++

12.08.2014, 09:10. Просмотров 889. Ответов 19
Метки нет (Все метки)

Здравствуйте. Возможно ли в C++ реализовать аналог функции read() из паскаля. Хотя бы с условием, что все входные данные одного типа. Без передачи указателя
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 09:10     Возможно ли реализовать аналог функции Read из Паскаля?
Посмотрите здесь:
Реализовать аналог функции Magic (Matlab) на С++ C++
А почему ошибка, что функции print и read не определены в функции main()? C++
C++ Как изменить расширение файлов в папке средствами C++ (возможно, есть какой-то аналог changefileext из делфи)?
Аналог процедуры str в Си++ или как реализовать? C++
C++ Реализовать собственный аналог контейнера std::map
Функции write и read C++
C++ Реализовать аналог класса std::string с помощью vector
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BlackIce
310 / 172 / 64
Регистрация: 18.01.2014
Сообщений: 387
12.08.2014, 09:19     Возможно ли реализовать аналог функции Read из Паскаля? #2
Чем работа с потоками не устраивает?

C++
1
2
3
4
int a;
double b;
std::string c;
std::cin >> a >> b >> c;
Андрей Xomach
8 / 8 / 0
Регистрация: 22.01.2012
Сообщений: 59
12.08.2014, 09:34  [ТС]     Возможно ли реализовать аналог функции Read из Паскаля? #3
BlackIce, так получилось, что сейчас мне нужно передать аргументы именно через запятую и без "&"
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
12.08.2014, 09:39     Возможно ли реализовать аналог функции Read из Паскаля? #4
Цитата Сообщение от Андрей Xomach Посмотреть сообщение
так получилось, что сейчас мне нужно передать аргументы именно через запятую
А конкретнее? С примером кода.
Андрей Xomach
8 / 8 / 0
Регистрация: 22.01.2012
Сообщений: 59
12.08.2014, 09:42  [ТС]     Возможно ли реализовать аналог функции Read из Паскаля? #5
C++
1
2
3
4
int a, b, c, d;
read (a, b, c, d); // можно даже read <int> (a, b, c, d), хотя сложно представить код, где это потребуется
string s, g;
read (s, g);
естественно, этот read() должен в итоге использовать cin
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
12.08.2014, 09:48     Возможно ли реализовать аналог функции Read из Паскаля? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да написать-то можно, я только в упор не понимаю зачем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
 
template <class T>
void Read(T& item) {
    std::cin >> item;
}
 
template <class T, class... Args>
void Read(T& item, Args&&... args) {
    Read(item);
    Read(args...);
}
 
int main() {
    int a, b;
    std::string str;
    
    Read(a, b, str);
    
    std::cout << a << " " << b << " " << str;
}
http://ideone.com/ABUA3o
Андрей Xomach
8 / 8 / 0
Регистрация: 22.01.2012
Сообщений: 59
12.08.2014, 09:52  [ТС]     Возможно ли реализовать аналог функции Read из Паскаля? #7
C++
1
2
3
4
5
template <class T, class... Args>
void Read(T& item, Args&&... args) {
    std::cin >> item;
    Read(args...);
}
0x10, вау... Что-то новенькое. Огромное вам спасибо. Понять бы теперь, что это за магия такая
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
12.08.2014, 09:56     Возможно ли реализовать аналог функции Read из Паскаля? #8
Магия называется Variadic Templates, требует компилятор с поддержкой С++11 и, я почти уверен, для Вашей задачи необходимости в таких извращениях нет. Поэтому и спрашивал: зачем?
Андрей Xomach
8 / 8 / 0
Регистрация: 22.01.2012
Сообщений: 59
12.08.2014, 10:04  [ТС]     Возможно ли реализовать аналог функции Read из Паскаля? #9
0x10, наверное, просто из любопытства
Еще год-два назад в рамках олимпиадного программирования захотелось избавиться от
C++
1
2
type a, b, c, d;
cin >> a >> b >> c >> d;
и преобразовать это в
C++
1
get (type, a, b, c, d);
some_name
Вежливость-главное оружие
221 / 221 / 55
Регистрация: 19.02.2013
Сообщений: 1,431
12.08.2014, 10:52     Возможно ли реализовать аналог функции Read из Паскаля? #10
Попробуйте вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
 
template <class T>
void read(T arg0, ...){ 
    T* ptrArg = (T*)&arg0;
    while(*ptrArg != 0){
        std::cin >> (**ptrArg);     
        ++ptrArg;        
    }
}
 
int main()
{    
    double a = 0, b = 0, c = 0;
    read<double*>(&a, &b, &c, 0);
    std::cout <<"  "<< a <<"  "<< b <<"  "<< c;
    return 0;
}
Добавлено через 7 минут
0x10, я вот только понять не могу, как вы по стеку двигаетесь?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
12.08.2014, 11:04     Возможно ли реализовать аналог функции Read из Паскаля? #11
Цитата Сообщение от some_name Посмотреть сообщение
Попробуйте вот так:
Работа с указателями сводит на нет всю безопасность относительно типов.

Цитата Сообщение от some_name Посмотреть сообщение
я вот только понять не могу, как вы по стеку двигаетесь?
"Движения по стеку" нет. В строке 12 происходит разворачивание пакета аргументов args и поиск наиболее подходящей функции. Пока в пакете > 1 аргумента вызывается эта же функция Read и первый элемент пакета связывается с ее первым аргументом. Когда в пакете остается один элемент, вызывается версия Read, принимающая единственный аргумент.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
12.08.2014, 11:09     Возможно ли реализовать аналог функции Read из Паскаля? #12
Цитата Сообщение от 0x10 Посмотреть сообщение
Работа с указателями сводит на нет всю безопасность относительно типов.
Это ты в каком смысле?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
12.08.2014, 11:13     Возможно ли реализовать аналог функции Read из Паскаля? #13
Цитата Сообщение от Voivoid Посмотреть сообщение
Это ты в каком смысле?
На этапе компиляции никак не контролируется, что все аргументы, переданные в функцию, будут одного типа, а она это предполагает, пытаясь перемещаться по стеку аргументов путем смещения указателя.
Андрей Xomach
8 / 8 / 0
Регистрация: 22.01.2012
Сообщений: 59
12.08.2014, 13:44  [ТС]     Возможно ли реализовать аналог функции Read из Паскаля? #14
0x10, стоп, можно глупый вопрос?
Ведь template создает новую версию функции для различных аргументов шаблона, так? Но тогда данная реализация приведет к тому, что будет создано по 1 функции read для каждого числа аргументов. То есть, если я вызову read от 5 аргументов, это создаст 4 версии функции read, не считая стандартной.
+ к тому, рекурсивная передача аргументов будет занимать квадратное время относительно числа входных данных, нет?
Конечно, даже если я тут и прав, все это несущественно в данном конкретном примере (время на считывание уйдет много больше), но все-таки, разве рекурсивный вызов шаблонной функции не есть зло?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 14:19     Возможно ли реализовать аналог функции Read из Паскаля?
Еще ссылки по теме:
C++ Возможно ли реализовать шаблон?
Максимальное значение _Count функции ifstream::read() C++
C++ Помогите реализовать программу, возможно за денежное вознаграждение
C++ Аналог VB-функции Like
Возможно ли реализовать клиент и сервер на разных машинах в одной ЛВС? C++

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

Или воспользуйтесь поиском по форуму:
some_name
Вежливость-главное оружие
221 / 221 / 55
Регистрация: 19.02.2013
Сообщений: 1,431
12.08.2014, 14:19     Возможно ли реализовать аналог функции Read из Паскаля? #15
Цитата Сообщение от 0x10 Посмотреть сообщение
разворачивание пакета аргументов args
так а пакет из себя что представляет?
и во что он разворачивается?
Yandex
Объявления
12.08.2014, 14:19     Возможно ли реализовать аналог функции Read из Паскаля?
Ответ Создать тему
Опции темы

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