LINUX.ORG.RU

Макросы в C++


0

0

Можно ли в С++ в качестве разделителя в макросах использовать не запятую? Пытался написать что-то вроде foreach

#define foreach_vector(iterator, vector) for(iterator = vector.begin(); iterator != vector.end(); iterator++)

Можно ли сделать что-то вроде

#define foreach_vector(iterator in vector) ...

Просто так это не компилится. Реализуемо ли это в принципе?

Ответ на: комментарий от rexadecimal

> все же понятнее и приятнее было бы писать
> foreach_vector (myIter in myVect) {
> //...
>}

все же понятнее и приятнее писать так, как принято в конкретно взятом монастыре:

std::for_each(v.begin(), v.end(), foo());

...а не городить непонятно что. в белых монастырях за такое обычно секут розгами дабы не смущали братьев и не отвлекали по чем зря от молитвы.

// wbr

klalafuda ★☆☆
()

вообще - да, можно, только несколько геморройно. foreach написан в Qt и позволяет писать код вроде
foreach(int t, intVec) {
  cout << t;
}

Посмотри там код, там два варианта - с typeof (гнутое расширение) и без него.

theos ★★★
()
Ответ на: комментарий от klalafuda

Об этом еще не знал, пока же только учусь. Благодарю.

rexadecimal
() автор топика
Ответ на: комментарий от klalafuda

только foo() должен быть конструктором объекта с перегруженным оператором (), что порождает синтаксический перегруз %(

theos ★★★
()
Ответ на: комментарий от theos

> только foo() должен быть конструктором объекта с перегруженным оператором (),
> что порождает синтаксический перегруз %(

ну вообще-то не обязательно. например:

#include <algorithm>
#include <iostream>
#include <vector>

void
foo(int i)
{
    std::cout << i << std::endl;
}

int
main()
{
    std::vector<int> v(3);
    v[0] = 1;
    v[1] = 2;
    v[2] = 3;
    std::for_each(v.begin(), v.end(), foo);
    return 0;
}

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

да, извените стормозил. давно на с++ не писал.

theos ★★★
()

> #define foreach_vector(iterator, vector) for(iterator = vector.begin(); iterator != vector.end(); iterator++)

> #define foreach_vector(iterator in vector)

#define in ,

> теоретики подтягиваются...

..и практики :)

anonymous
()
Ответ на: комментарий от anonymous

Уже попробовал #define in ,

Компилятор стал считать foreach_vector функцией и говорит, что она неопределена.

Потестил в оффтопике под MSVS 2008 - то же самое.

rexadecimal
() автор топика
Ответ на: комментарий от stassats

>Как же убоги языки без нормальных макросов.

Лично меня в данном случае раздражает отсутствие не "нормальных макросов", а в поддержки лямбд. В принципе, нагромождение вызовов compose, bind1st/2nd, select1st/2nd, mem_fun и т. п. позволяет записать большинство вызовов for_each "в одну строчку", но это как бы не совсем читабельно :)

V_L_A_D ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.