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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать пару макросов 
:(
    Опции темы
borisbn
Дата 3.2.2012, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(502 @  3.2.2012,  18:40 Найти цитируемый пост)
вроде в c++ есть auto, или нет?

если на этапе компиляции тип возвращаемого значения у выражения понятен компилятору, то он вместо auto подставляет этот тип. если же компилятор не может определить тип (а в твоём случае он определяется на этапе выполнения), то компилятор выдаст ошибку на auto.
Код

std::vector< int > v;
auto it = v.begin(); // тип it будет std::vector< int >::iterator

std::string str = "true";
bool b = false;
auto x = ... ? str : b; // error



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 3.2.2012, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(newbee @  3.2.2012,  16:02 Найти цитируемый пост)
Правильный AND (или цепочка из них) должен последовательно выполнять выражения и в случае истинности их всех возвращать результат последнего вычисления.

а если ни одно не истинно, что возвращать?

Цитата(newbee @  3.2.2012,  16:02 Найти цитируемый пост)
OR: последовательно вычисляются выражения и возвращается результат первого истинного.

тут должен возвращаться результат второго, если первое не истинно? а если ни одно не истинно, бросать исключение? в первом случае так же?

Это сообщение отредактировал(а) boostcoder - 3.2.2012, 19:38
PM WWW   Вверх
boostcoder
Дата 3.2.2012, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



вот что получилось:
Код

#include <iostream>
#include <boost/preprocessor.hpp>

#define Ext_OR_SUBCOND(unused, idx, seq) \
   (BOOST_PP_SEQ_ELEM(idx, seq)) \
   ? \
   (BOOST_PP_SEQ_ELEM(idx, seq)) \
   :

#define Ext_OR(seq, def) \
   ( \
      BOOST_PP_REPEAT( \
         BOOST_PP_SEQ_SIZE(seq), \
         Ext_OR_SUBCOND, \
         seq \
      ) \
      (def) \
   )

#define Ext_AND_SUBCOND(unused, idx, tuple) \
   !( \
      BOOST_PP_SEQ_ELEM( \
         idx, \
         BOOST_PP_TUPLE_ELEM(2, 0, tuple) \
      ) \
   ) ? ( \
      BOOST_PP_IF( \
         BOOST_PP_EQUAL(idx, 0), \
         BOOST_PP_TUPLE_ELEM(2, 1, tuple), \
         BOOST_PP_SEQ_ELEM( \
            BOOST_PP_SUB(idx, 1), \
            BOOST_PP_TUPLE_ELEM(2, 0, tuple) \
         ) \
      ) \
   ) :

#define Ext_AND(seq, def) \
   ( \
      BOOST_PP_REPEAT( \
         BOOST_PP_SEQ_SIZE(seq), \
         Ext_AND_SUBCOND, \
         (seq,def) \
      ) \
      ( \
         BOOST_PP_SEQ_ELEM( \
            BOOST_PP_SUB(BOOST_PP_SEQ_SIZE(seq), 1), \
            seq \
         ) \
      ) \
   )

int def() {
   return -1;
}

int main() {
   int b1=1, b2=2, b3=3;

   std::cout << Ext_OR((b1)(b2)(b3), def()) << std::endl; // 1
   std::cout << Ext_AND((b1)(b2)(b3), def()) << std::endl; // 3
}

http://liveworkspace.org/code/f72ac6a3004d...60bd21374ab273d

результат препроцессирования:
Код

int def() {
   return -1;
}

int main() {
   int b1=1, b2=2, b3=3, b4=0;

   std::cout << ( ( b1 ) ? ( b1 ) : ( b2 ) ? ( b2 ) : ( b3 ) ? ( b3 ) : (def()) ) << std::endl;
   std::cout << ( !( b1 ) ? ( def() ) : !( b2 ) ? ( b1 ) : !( b3 ) ? ( b2 ) : ( b3 ) ) << std::endl;
}



т.к. не известно как поступать если ни одно из условий не верно, в макросы Ext_OR и Ext_AND добавил второй аргумент принимающий выражение.

Это сообщение отредактировал(а) boostcoder - 3.2.2012, 21:51
PM WWW   Вверх
newbee
Дата 3.2.2012, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(borisbn @  3.2.2012,  19:26 Найти цитируемый пост)
А что должен возвращать AND, если одно из выражений ложно ?
В случае с bool или с указателем - понятно (false и NULL соответственно), а что в случае с int или с пользовательским типом ?
Конструктор по умолчанию.

Цитата(tzirechnoy @  3.2.2012,  18:25 Найти цитируемый пост)
Шли бы Вы хаскель изучать, а? Тем более, что через монады это действительно делается, в том числе и в плюсах. 
Ну вот зачем ты глупую девушку грузишь такими высокими материями, монады, каррирование, паттерн матчинг... Может мне еще матфаковский курс матана вызубрить и теорию категорий? Если напишешь свой вариант с монадами и замыканиями или дашь ссылки на решение моей задачки, будем разговаривать...

Цитата(borisbn @  3.2.2012,  19:26 Найти цитируемый пост)
М.б. то выражение, на котором "споткнулся" ??? В данном случае o2 ?
Нет же, суть AND в том, чтобы сигнализировать о фэйле через возвращаемое значение. В топку пользовательские типы, хотя бы для целых и указателей...

Цитата(502 @  3.2.2012,  19:34 Найти цитируемый пост)
это все есть в javascript
Ну это же прекрасно!

Цитата(borisbn @  3.2.2012,  19:38 Найти цитируемый пост)
переменные в javascript не типизированны, а в Си++ ты не можешь в зависимости от условия присвоить переменной либо false либо std::string, например. 
Вот-вот. Статическую типизацию можно частично забороть шаблонами (ну то есть как бы забороть, она останется в силе) или накрутить ручную динамическую... Я конечно больше за второй вариант, но он сливает в производительности, поэтому в С++ от статической лучше не отказываться.

Цитата(math64 @  3.2.2012,  19:40 Найти цитируемый пост)
Примерно так:
Сейчас не в состоянии распарсить, утром попробую )

Цитата(boostcoder @  3.2.2012,  20:13 Найти цитируемый пост)
а если ни одно не истинно, что возвращать?
Конструктор по умолчанию.

Цитата(boostcoder @  3.2.2012,  22:01 Найти цитируемый пост)
вот что получилось:
Спасибо, сейчас попытаюсь сконцентрироваться. Вариант с def тоже уместен.




--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 4.2.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



newbee, 
вот еще направление, если я прально понял задачу :
http://liveworkspace.org/code/962529beac6c...37a1ada28038e6e



--------------------
PM MAIL WWW   Вверх
newbee
Дата 4.2.2012, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Ууууух это вообще взрыв мозга))) Как это работает вообще не понятно)

Код

std::cout << Ext_OR((0)(Ext_AND((1)(0), 0))(2), def()) << std::endl; //wait: 2; recieve: 1 : FAIL
std::cout << Ext_OR((0)(Ext_AND((0)(1), 0))(2), def()) << std::endl; //wait: 2; recieve: 2 : OK


AND как-то неправильно раскрывается...

Добавлено через 9 минут и 53 секунды
mes, спасибо большое, эта идея у меня была, но не придумала как побороть явное создание вспомогательных объектов... Все же подобная запись AND-OR интересна в первую очередь потому, что часто позволяет сильно сократить размер кода.

Я обычно пользуюсь ленивостью || и && для записи условных выражений, но часто требуется получить значение выражения one || two || three, приходится писать лишний код... 


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.2.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Код

int main() {
   std::cout << ( (0) ? (0) : (( !( 1 ) ? ( 0 ) : !( 0 ) ? ( 1 ) : ( 0 ) )) ? (( !( 1 ) ? ( 0 ) : !( 0 ) ? ( 1 ) : ( 0 ) )) : (2) ? (2) : (def()) ) << std::endl;
   std::cout << ( (0) ? (0) : (( !( 0 ) ? ( 0 ) : !( 1 ) ? ( 0 ) : ( 1 ) )) ? (( !( 0 ) ? ( 0 ) : !( 1 ) ? ( 0 ) : ( 1 ) )) : (2) ? (2) : (def()) ) << std::endl;
}


что тут не так? smile

Добавлено через 2 минуты и 8 секунд
по отдельности Ext_OR и Ext_AND работают как надо?
PM WWW   Вверх
newbee
Дата 4.2.2012, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(boostcoder @  4.2.2012,  01:30 Найти цитируемый пост)
что тут не так?
Я думаю, где-то скобок не хватает  smile 

Смотри, у тебя AND работает по-разному для AND(1,0) и AND(0,1), хотя в обоих случаях должен быть false (или значение по умолчанию, как сейчас сделано у тебя).

Добавлено через 3 минуты и 59 секунд
http://liveworkspace.org/code/972cca9cb2ab...74fa566a52388b9


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.2.2012, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(newbee @  4.2.2012,  00:36 Найти цитируемый пост)
где-то скобок не хватает

нее ,компилятор бы ругался.

Цитата(newbee @  4.2.2012,  00:36 Найти цитируемый пост)
у тебя AND работает по-разному для AND(1,0) и AND(0,1), хотя в обоих случаях должен быть false (или значение по умолчанию, как сейчас сделано у тебя).

что-то накосячил... ща
PM WWW   Вверх
newbee
Дата 4.2.2012, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



ЗЫ. Прикольный ты себе домен выбрал, уже скольок раз вижу, а кажется lispworks.com ))

ЗЫЫ Модераторы, пожалуйста исправьте заголовок: "помогитЕ", я когда вижу эту ошибку, хочу убить автора.


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.2.2012, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(newbee @  4.2.2012,  00:43 Найти цитируемый пост)
ЗЫЫ Модераторы, пожалуйста исправьте заголовок

это ты сама можешь сделать. "редактировать" на топике.

Добавлено через 2 минуты и 35 секунд
Цитата(newbee @  3.2.2012,  16:02 Найти цитируемый пост)
Правильный AND (или цепочка из них) должен последовательно выполнять выражения и в случае истинности их всех возвращать результат последнего вычисления.

ты тут не ошиблась?

а то я сделал так, что возвращает результат последнего истинного выражения)
PM WWW   Вверх
newbee
Дата 4.2.2012, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Заголовок не дает исправить, только текст...

Добавлено @ 00:50
Цитата(boostcoder @  4.2.2012,  01:44 Найти цитируемый пост)
ты тут не ошиблась?

Цитата(boostcoder @  4.2.2012,  01:44 Найти цитируемый пост)
Правильный AND (или цепочка из них) должен последовательно выполнять выражения и в случае истинности их всех возвращать результат последнего вычисления.


Понимаешь, это тот же оператор AND по сути, только в случае успешной проверки (AND 1 2 3), возвращаем 3 вместо true, в случае неудачной (AND 1 0 2), возвращаем 0.

Это сообщение отредактировал(а) newbee - 4.2.2012, 00:51


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.2.2012, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



вот:
Код

#include <iostream>
#include <boost/preprocessor.hpp>

#define Ext_OR_SUBCOND(unused, idx, seq) \
   (BOOST_PP_SEQ_ELEM(idx, seq)) \
   ? \
   (BOOST_PP_SEQ_ELEM(idx, seq)) \
   :

#define Ext_OR(seq, def) \
   ( \
      BOOST_PP_REPEAT( \
         BOOST_PP_SEQ_SIZE(seq), \
         Ext_OR_SUBCOND, \
         seq \
      ) \
      (def) \
   )


#define Ext_AND_SUBCOND(unused, idx, tuple) \
   ( \
      BOOST_PP_SEQ_ELEM( \
         idx, \
         BOOST_PP_TUPLE_ELEM(2, 0, tuple) \
      ) \
   ) \
   BOOST_PP_IF( \
      BOOST_PP_NOT_EQUAL( \
         BOOST_PP_ADD(idx, 1), \
         BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 0, tuple)) \
      ), \
      && , \
      \
   )
   

#define Ext_AND(seq, def) \
   ( \
      ( \
         BOOST_PP_REPEAT( \
            BOOST_PP_SEQ_SIZE(seq), \
            Ext_AND_SUBCOND, \
            (seq,def) \
         ) \
      ) \
      ? \
      ( \
         BOOST_PP_SEQ_ELEM( \
            BOOST_PP_SUB(BOOST_PP_SEQ_SIZE(seq), 1), \
            seq \
         ) \
      ) \
      : (def) \
   )

int def() {
   return -1;
}

int main() {
   std::cout << Ext_OR((0)(Ext_AND((1)(0), 0))(2), def()) << std::endl; //wait: 2; recieve: 1 : FAIL
   std::cout << Ext_OR((0)(Ext_AND((0)(1), 0))(2), def()) << std::endl; //wait: 2; recieve: 2 : OK
}

http://liveworkspace.org/code/f35d3794bc73...ff02fba37c68e15

препроцессированный код:
Код

int main() {
   std::cout << ( (0) ? (0) : (( ( ( 1 ) && ( 0 ) ) ? ( 0 ) : (0) )) ? (( ( ( 1 ) && ( 0 ) ) ? ( 0 ) : (0) )) : (2) ? (2) : (def()) ) << std::endl;
   std::cout << ( (0) ? (0) : (( ( ( 0 ) && ( 1 ) ) ? ( 1 ) : (0) )) ? (( ( ( 0 ) && ( 1 ) ) ? ( 1 ) : (0) )) : (2) ? (2) : (def()) ) << std::endl;
}


все правильно?

Это сообщение отредактировал(а) boostcoder - 4.2.2012, 01:26
PM WWW   Вверх
mes
Дата 4.2.2012, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



boostcoder, если я правильно понял, то 
OR возвращает первое истинное, либо последнее если такого нет..
AND возвращает первое ложное, либо последнее если такого нет..
def  не нужен


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.2.2012, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  4.2.2012,  01:22 Найти цитируемый пост)
def  не нужен 

ну вроде как да...

Добавлено @ 01:35
все равно не понимаю..
если не будет def, то что вернуть в случае лжи в следующем примере?
Код

( b1 ) && ( b2 ) && ( b3 ) ? ( b3 ) : def()


Это сообщение отредактировал(а) boostcoder - 4.2.2012, 01:38
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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