Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> устраивает ли Вас препроцессор С++? нужно ли расширение функциональности 
:(
    Опции темы
 
Устраивают ли Вас возможности препроцессора С++?
Да, никаких расширений не нужно [ 21 ]  [77.78%]
Да, но расширение бы не помешало [ 6 ]  [22.22%]
Нет, они не отвечают моим требованиям [ 0 ]  [0.00%]
Всего проголосовавших: 27
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
Jcs
Дата 17.5.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Здравствуйте, ни у кого не возникало ощущения куцести плюсового препроцессора? У меня, например, периодически возникают случаи, когда его возможностей определенно хватает. Вот один из них. Стандартный случай, когда нужны методы с различными правам доступа ко внутренним переменным. Приходится писать кучу одинакового кода. Данный пример для двух переменных, и то разница уже видна, а что будет когда их число приблизится, например, к 10?
Код

class model
{
    int property0_;
    double propety_1;

public:
    int& property0()
    {return property0_;}

    double& property1()
    {return property1_;}

    const int& property0() const
    {return property0_;}

    const double& property1() const
    {return property2_;}
};

class model
{
    int property0_;
    double propery1_;
public:
    %for_each_member
    %{
        %member_type& %member_name()
        {return %member_name;}

        const %member_type %member_name() const
        {return %member_name;}
    %}
};

Этот случай не первый и не единственный, хотелось бы послушать общество. Заранее спасибо
PM   Вверх
MAKCim
Дата 17.5.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



в целом хватает
хотя препроцессор GAS (Gnu Assembler) по-лучше будет
я бы добавил
1. Перегрузку макрофункций
Код

#define GET(a) (a)
#define GET(a, b) ((a) + (b))
...

2. Циклы 
Код

int array[SIZE] = {
#repeat SIZE - 1
    __ITERATION__,
#endrep
    SIZE - 1 };

где __ITERATION__ - номер текущей итерации (0, 1, 2, ...)
3. Внутренние макродирективы
Код

#repeat SIZE - 1
    #if __ITERATION__ != 50
        __ITERATION__
    #else
        0
    #endif
#endrep


Это сообщение отредактировал(а) MAKCim - 17.5.2007, 19:30


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 17.5.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
nickless
Дата 17.5.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



ИМХО возможностей у препроцессора вполне достаточно, и даже они обычно не используются, потому что в С++ есть много способов сделать то же самое проще/лучше/удобнее. См. например шаблоны.
Насчет твоего примера, можно сделать например так:
Код
#define ACCESSOR(type,name)     type& name() { return name##_; } \
                                const type & name() const { return name##_; }

class model
{
public:
    ACCESSOR( int, property0 )
    ACCESSOR( double, property1 )
private:
    int property0_;
    double property1_;
};


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

Есть еще примеры?


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Daevaorn
Дата 17.5.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Проще пропускать сорсы через какой-нибудь шаблонизатор, чем ждать пока сделают изменения в препроцессоре. Например так как поступает Trolltech.
PM MAIL WWW   Вверх
JackYF
Дата 17.5.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(JackYF @  17.5.2007,  19:33 Найти цитируемый пост)
предложите для нее синтаксис. 


Это же надо, 
MAKCim, Максим прочитал мои мысль, пока я ее писал...


Возможно, и неплохо было бы. Правда, для себя не помню случаев, чтобы такие штуки мне понадобились.
Хотя, без сомнения, кому-то понадобится может.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 17.5.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Jcs @  17.5.2007,  19:57 Найти цитируемый пост)
 Данный пример для двух переменных, и то разница уже видна, а что будет когда их число приблизится, например, к 10?

Кстати, это пример плохого дизайна, а не слобости препроцессора;)
PM MAIL WWW   Вверх
Hurricane
Дата 17.5.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Daevaorn, ты тоже мыслечитатель?  smile 

Цитата(Daevaorn @  17.5.2007,  11:37 Найти цитируемый пост)
Кстати, это пример плохого дизайна, а не слобости препроцессора;) 


Первая мысль была именно такая.

Добавлено через 4 минуты и 37 секунд
Кстати, а почему нет варианта "В препроцессоре и так много лишнего, сократить до минимума". А то начинаешь юзать всякие темплейтные min/max/swap, а какой-то умник их уже через дефайны переопределил. И начинаешь чесать репу, лихорадочно соображая что сделал не так.
PM MAIL   Вверх
MAKCim
Дата 17.5.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



 smile 
Daevaorn
прикольное число сообщений у тебя 1234  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 17.5.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



ИМХО, основной недостаток препроцессора в том, что он не разбирается в том, что обрабатывает (ну разве что не трогает строки и не обрабатывает max в max1)
в этом смысле шаблоны более "встроены в язык", хотя и возможностей местами поменьше
так что, возможно, было бы неплохо, как-то сближать эти два инструмента...


--------------------
qqq
PM WWW   Вверх
nerezus
Дата 17.5.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Собственно шаблоны и есть аналогом препроцессора, просто шаблоны не являются препроцессором по определению )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
jonie
Дата 17.5.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



о чем Вы?! вам мало "приятных" и незаметных вещей что дает вам препроцессор?)
Код

#define max(a,b) a<b?b:a         //ну, конечно, сейчас все начнут говорить что мол надо скобок больше) это пример только
....
int a=20;
int b=30;
int c = max(a+=5,b);  //интересно что это даст ....

кстати можете себя проверить.. код даст 50 (а вот на старых компиляторах может дать и не 50)...
смех смехом а я как-то часа 4 искал такую "ошибку" (не в своем коде).... уж никак не пологал что сделан будет макрос... вот чего в голву не пришло, того не пришло)
---------------------
все эти намудреные препроцессорные директивы выливаются в полную мешанину и панику при отладке (нее дай вам столкнуться с ошибкой неявной в большом макросе)...
------------------
Цитата

1. Перегрузку макрофункций
inline - функции чем не устраивают?!
Цитата

2. Циклы 

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

----------------
в общем говоря о "плюсах" не стоит забывать и о минусах....а хочется гуд препроцессор какй вам надо так есть perl ....)) пишите и травите на свои исходники....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Jcs
Дата 18.5.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



nickless
Предложенный вами вариант, конечно, упрощает, но тем не менее нужно для каждого члена класса писать вызов макроса.
Насчет шаблонов полностью согласен, но они не обеспечивают возможность перечисления членов структуры (или я не знаю как это сделать).
Еще один случай, когда это было бы удобно. Например, есть текстовый файл, из которого нужно считать структуру. В случае возможности перечисления можно было бы написать подобный код (данный пример призван показать полезность перечисления, поэтому, пожалуйста, не обращайте внимания на контроль ошибок и проч.):
Код

struct config
{
    int param0,param1;
    float param2,param3;
    double param4,param5;
};

template<ParamType> 
    void read_param(file& ifile,const char* param_name,ParamType& param_ref);

template<StructToRead>
    void read_config(StructToRead& struct_ref,const char* file_name)
{
    file ifile(file_name,IO_read_mode);
    
    %for_each_member_of(StructToRead)
    %{    
        read_param(ifile,"%member_name",struct_ref.%member_name);
    %}
}

PM   Вверх
Любитель
Дата 18.5.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Hurricane @  17.5.2007,  19:44 Найти цитируемый пост)
Кстати, а почему нет варианта "В препроцессоре и так много лишнего, сократить до минимума". 

Кстати вариант то правильный smile

Если хочется поизвращаться - советую посмотреть ещё на boost::preprocessor. Я толком не смотрел, но если не ошибаюсь циклы там есть. Правда, наверно, с ограниченным количеством итераций (просто не представляю как сделать, юзаю лишь существующие возможности, по-другому).

А вообще шаблоны для кого придумывали? smile


--------------------
PM MAIL ICQ Skype   Вверх
Jcs
Дата 18.5.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Наверное, вопрос был поставлен не совсем корректно. Правильней было бы спросить - устраивают ли Вас возможности метапрограммирования с С++? Тогда сюда автоматом войдут и шаблоны, и макро. Думаю функциональность шаблонов тоже есть куда расширять. Например в книге "шаблоны. Спавочник пользователя" говорится о возможности включения именованных аргументов шаблонов. Я бы еще добавил частичную специализацию по количеству шаблонных аргументов.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1386 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.