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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 165, средняя оценка - 4.65
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
#1

реализация foreach в C++, другой синтсксис - C++

25.02.2010, 20:03. Просмотров 21310. Ответов 9

нашел тут некоторое собрание библиотек на буст орг, там есть такая что содержет реализацию функции... или чего то подобного... foreach, сохожей по синтаксису с foreach из C#. Именно синтаксис её применения лично меня очень удивляет! Как такое можно было реализовать средствами C++ ума не приложу... В самом файле с реализацией я ничего не понял (. Кто знает, дайте пожалуйста ссылочу почитать об этом обучающую литературу, хоть на английском... хоть на китайском))) а то я даже не знаю, что спросить у гугла, а тема такая интересная.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <boost/foreach.hpp>
#include <conio.h>
#include <string>
#include <iostream>
#define foreach BOOST_FOREACH
 
using namespace std;
int main()
{
    string str("Amazing syntax of \"foreach\"!");
    foreach(char c,str)
    {
       cout << c;
    }
    getch();
    return 0;
}
вывод на экран:
Amazing syntax of "foreach"!
тут к сожалению, только документация.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2010, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реализация foreach в C++, другой синтсксис (C++):

tuple foreach - C++
Взял за основу вот это ...

Аналог foreach - Visual C++
У меня есть обьект, поддерживающий интерфейс IEnumerable&lt;T&gt;. Как пройтись по всем елементам? В C# это просто foreach(var item in items)...

Foreach - C++
Здравствуйте, подскажите как написать свой цикл foreach?

Обработка XML. Цикл foreach (XmlNode.) вложенный во внешний foreach - C#
Здравствуйте. Возникла проблема при обработке XML-файла (с помощью XMLDocument). В теме я новичок. Имеется XML файл такого типа: ...

Ошибка в foreach: foreach statement cannot operate on variables of type 'System.Collections.IEnumerator' - C#
using System; using System.Collections; namespace P { class Program { public static IEnumerator...

Нужен простой пример из Foreach в Parallel.Foreach - C#
Покажите любой простой пример из Foreach в Parallel.Foreach. Не могу до конца понять.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
26.02.2010, 14:48 #2
Найдите файл с этой функцией (описание и само тело) и выложите в виде кода. Размерчик для рабочего интернета несколько великоват.

Добавлено через 4 часа 55 минут
Выдача Googl'а:
C++
1
2
3
4
5
6
template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function f)
  {
    for ( ; first!=last; ++first ) f(*first);
    return f;
  }
Далее скорее всего можно заюзать define. Ну и касты всего, чего можно в InputIterator.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
26.02.2010, 17:59  [ТС] #3
Стандарнтый for_each из stl_algo мне знаком, и его реализация тривиальна. Насчет дифайнов я тоже думал, но дело в том, что эта функция по синтаксису похожа на интегрированную управляющую структуру... если можно так выразиться, типа if () {} или for () {}, дефайнами такого не сделаешь, по крайней мере мне кажется, что это невозможно.

Насчет заголовочного файла где определена функция, он в свою очередь включает большое количество других единиц трансляции - довольно трудно воспринимать, я его выложу заархивировав, но чтобы использовать эту функцию вам придется качать весь архив с сайта boost.org.

наверно мне показалось, я извеняюсь, но может вы не поняли немного и думали что я спрашиваю - как привести использование функции к такому синтаксису, но дело не в простом приведении синтаксиса, программа, пример которой я привел, компилируется и работает нормально, там всего лишь заменено громоздкое BOOST_FOREACH на локаничное foreach. Тут не простое приведение синтаксиса, это явно какое-то особое определение функции. Файл с реализацией содержит 1000 строк кода!
Вложения
Тип файла: zip foreach.zip (7.0 Кб, 144 просмотров)
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
27.02.2010, 00:45 #4
Цитата Сообщение от Aye Aye Посмотреть сообщение
Тут не простое приведение синтаксиса, это явно какое-то особое определение функции. Файл с реализацией содержит 1000 строк кода!
Незнаю, не пользовался бустовским foreach, но если верить документации это обычный макрос. Вообще, для простых статических массивов реализвать это несложно.
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
27.02.2010, 08:55 #5
Пытались "проваливаться" внутрь функции при отладке? Про строки вот такой кусок кода:
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
template<typename T, typename C = boost::mpl::false_>
struct foreach_iterator
{
    // **** READ THIS IF YOUR COMPILE BREAKS HERE ****
    //
    // There is an ambiguity about how to iterate over arrays of char and wchar_t. 
    // Should the last array element be treated as a null terminator to be skipped, or
    // is it just like any other element in the array? To fix the problem, you must
    // say which behavior you want.
    //
    // To treat the container as a null-terminated string, merely cast it to a
    // char const *, as in BOOST_FOREACH( char ch, (char const *)"hello" ) ...
    //
    // To treat the container as an array, use boost::as_array() in <boost/range/as_array.hpp>,
    // as in BOOST_FOREACH( char ch, boost::as_array("hello") ) ...
    #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
    BOOST_MPL_ASSERT_MSG( (!is_char_array<T>::value), IS_THIS_AN_ARRAY_OR_A_NULL_TERMINATED_STRING, (T&) );
    #endif
 
    // If the type is a pointer to a null terminated string (as opposed 
    // to an array type), there is no ambiguity.
    typedef BOOST_DEDUCED_TYPENAME wrap_cstr<T>::type container;
 
    typedef BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<
        C
      , range_const_iterator<container>
      , range_mutable_iterator<container>
    >::type type;
};
и чуть ниже практически то же для struct foreach_reverse_iterator

В общем чтобы работало везде, где только можно наворотили достаточно громоздкие конструкции. Впрочем оно того стоило.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
27.02.2010, 11:32  [ТС] #6
rangerx, если обычный макрос, то этот подход называется мета программирование? я обязательно почитаю про макросы по подробней (я плохо в них разбираюсь, вообще ни как ), хотя и сомневаюсь.

Yurii_74, спасибо большое! я не отлаживал. Но вот только приведенный вами код мне ясности не привнес (( я так понял, тут определения типов для далнейших итераций по контейнеру... а как же быть с:
C++
1
2
3
4
5
foreach(char c,str)
// этим!    
{ 
    cout << c;
}
вот в чем дело: имя (параметры,аргументы) бок_операторов, ведь если бы foreach определи как функцию то применение было бы имя (аргументы), вопрос в том как так определить функци, что бы можно было писать блок операторов после неё, который бы имел к ней прямое отношения, я даж не знаю как выразиться (((
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
27.02.2010, 14:24 #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Aye Aye Посмотреть сообщение
rangerx, если обычный макрос...
Чтобы в этом убедиться достаточно поковыряться в foreach.hpp. Сам BOOST_FOREACH занимает 10-15 строк кода. Всё остальное, как уж было сказано: "...чтобы работало везде, где только можно..."

Цитата Сообщение от Aye Aye Посмотреть сообщение
то этот подход называется мета программирование?
В принципе да. Т.е. препроцессор можно отнести к этому понятию.

Добавлено через 12 минут
Цитата Сообщение от Aye Aye Посмотреть сообщение
что бы можно было писать блок операторов после неё, который бы имел к ней прямое отношения, я даж не знаю как выразиться (((
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
#include <iostream>
 
#define foreach(new_var, array)\
        for(size_t index = 0; index < (sizeof(array)/sizeof(*array)); ++index)\
            for(new_var = array[index], flag = 1; flag; flag = 0)
 
int main()
{
    int int_arr[] = {9,8,7,6,5,4,3,2,1};
    foreach(int variable, int_arr)
    {
        std::cout << variable << ' ';
    }
 
    std::cout << std::endl;
 
    char char_arr[] = {'a','b','c','d','e','f','g'};
    foreach(char variable, char_arr)
    {
        std::cout << variable << ' ';
    }
 
    std::cout << std::endl;
 
    char* pchar_arr[] = {"one","two","three"};
    foreach(char* variable, pchar_arr)
    {
        std::cout << variable << ' ';
    }
 
    return 0;
}
В качестве примера думаю сойдёт.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
27.02.2010, 14:41 #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Только имей в виду, что и в такой реализации есть таки засада:
C++
1
2
3
4
5
6
7
8
    int* pint_arr = new int[10];
    int i = 0;
    foreach(int variable, pint_arr)
    {
        variable = ++i;
        std::cout << variable << ' ';
    }
    delete[] pint_arr;
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
27.02.2010, 15:09  [ТС] #9
ОГРОМНОЕ ВАМ СПАСИБО!!! я разобрался )
Platinumix
44 / 12 / 0
Регистрация: 28.12.2012
Сообщений: 191
15.01.2013, 00:31 #10
спасибо, я тоже тут посмотрел и оказалось не лишним, тоже разобрался))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2013, 00:31
Привет! Вот еще темы с ответами:

Реализация получения данных с другой страницы - PHP
Всем привет. Столкнулся с необходимостью получения данных с другого сайта. На странице имеется код типа: &lt;ol...

Реализация интерфейса из другой среды разработки - C#
Подскажите пожалуйста, как лучше реализовать интерфейс на картинке, а именно какие решения и контролы использовать: 1. &quot;плавающие окна&quot;....

Тип вывода <c:forEach ></c:forEach> - Java EE
Здравствуйте. У меня такая проблема. При выводе в jsp с помощью jstl &lt;c:forEach &gt;&lt;/c:forEach&gt;, выходит ошибка ...

Грамотная реализация передачи параметра из одного класса в другой - C# WPF
Всем привет. Пишу программу wpf. На форме есть кнопка, нажав на которую, я запускаю метод читки данных из файла. Сам метод является методом...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.01.2013, 00:31
Ответ Создать тему
Опции темы

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