- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
#include <iostream>
template< class Val >struct SwithClass
{
SwithClass( const Val & v ):val(v){}
void operator() (){}
template < class E, class F, class ... Args > void operator() ( E e, F f, Args ... args )
{
if( e==val ) f();
else (*this)( args... );
}
private:
Val val;
};
template< class Val > SwithClass<Val> Swith( const Val& v ){ return SwithClass<Val>(v);}
int main()
{
int x = 8;
Swith( x )
(
1, [](){ std::cout <<"x=1" << std::endl; },
8, [](){ std::cout <<"x=8" << std::endl; }
);
return 0;
}
LispGovno 11.11.2012 11:04 # 0
Gad Petrovich 11.11.2012 11:29 # 0
LispGovno 11.11.2012 11:57 # +1
myaut 11.11.2012 15:18 # +2
bormand 11.11.2012 11:15 # 0
Fai 11.11.2012 11:33 # +2
bormand 11.11.2012 11:37 # +2
Fai 11.11.2012 12:12 # +1
bormand 11.11.2012 12:25 # +3
Fai 11.11.2012 12:29 # 0
TarasB 11.11.2012 12:37 # +1
roman-kashitsyn 11.11.2012 12:37 # +1
Для сортировок часто в качестве операций выбирают требуемое число сравнений, именно, его и привёл борманд (правда, в вики n! * (n-1)).
defecate-plusplus 11.11.2012 12:34 # +3
bormand 11.11.2012 13:03 # 0
bormand 11.11.2012 13:26 # 0
Fai 11.11.2012 13:30 # 0
roman-kashitsyn 11.11.2012 12:08 # +2
Fai 11.11.2012 12:11 # 0
roman-kashitsyn 11.11.2012 12:23 # +1
defecate-plusplus 11.11.2012 11:54 # +2
LispGovno 11.11.2012 11:56 # +2
defecate-plusplus 11.11.2012 11:59 # +4
при желании, можно сделать хелпер is_defaulth<T>, который для Defaulth перегрузкой будет иметь enum { valueh = trueh; }, а для всех остальных - falseh, и от него плясать (первую часть не отменяет, зато можно извратиться и дефолтх отложить на последнюю очередь, заодно проверить, чтобы их было не больше одного)
bormand 11.11.2012 12:24 # +1
roman-kashitsyn 11.11.2012 12:39 # +3
Дефейкейстры
LispGovno 11.11.2012 12:45 # 0
http://ideone.com/j1sxa2
bormand 11.11.2012 13:01 # +2
Согласен. Пофиксил.
http://ideone.com/4ROpgg
Причем то, что defaulht стоит последним проверяется на этапе компиляции: http://ideone.com/G9FfN0
LispGovno 11.11.2012 13:15 # 0
PS: Ошибка не говорящая совершенно. static_assert бы туда...
bormand 11.11.2012 13:25 # +1
За счет несравнимости Defaulht с другими типами.
LispGovno 11.11.2012 13:37 # 0
defecate-plusplus 11.11.2012 13:41 # +2
в целом он какой-то broken этот static_assert, я не смог его заставить заработать на моем пыщь пыщь говнокоде
при этом я уронил liveworkspace.org, и теперь проверить поведение на BOOST_STATIC_ASSERT пока негде
defecate-plusplus 11.11.2012 13:47 # +2
в общем вот такой вот говнокот:
http://ideone.com/bpRJVI
если поставить defau1t последним, то г++ инстанциируя do_case<true>(f, args...) сделает непотребность в виде do_case<true>(f, defau1t, f, {}), и конечно стасик_ассерт заругает
что с этим делать?
еще интересней: http://ideone.com/N0ZuP5
sorry, unimplemented
LispGovno 11.11.2012 14:10 # +2
LispGovno 11.11.2012 14:40 # −1
Gad Petrovich 11.11.2012 19:32 # +1
http://ideone.com/e7vZTr
defecate-plusplus 11.11.2012 21:11 # +2
LispGovno 11.11.2012 21:21 # 0
http://ideone.com/PABJQf
defecate-plusplus 11.11.2012 21:24 # 0
типа о ((mytype *)0)->foo()
LispGovno 11.11.2012 21:26 # 0
bormand 11.11.2012 21:29 # 0
P.S. Сейчас пороемся в стандартах.
LispGovno 11.11.2012 21:34 # 0
В стандарте нет понятия креш. На некоторых платформах и средах будут испорчены вектора прерываний или ещё что-нибудь. Это есть UB по стадарту.
bormand 11.11.2012 21:37 # 0
The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points. If the type of the expression is “pointer to T,” the type of the result is “T.”
[Note: a pointer to an incomplete type (other than cv void ) can be dereferenced. The lvalue thus obtained can be used in limited ways (to initialize a reference, for example); this lvalue must not be converted to an rvalue, see 4.1. ]
Раз не описано - значит поведение на кривых указателях включая NULL будем считать UB.
LispGovno 11.11.2012 21:36 # +1
Вот и я думаю, что это не уб. уб начнется, когда с значением расположеным по этому указателю что-то начнешь делать, то есть &*c - не уб
defecate-plusplus 11.11.2012 21:37 # +1
они даже п.1.9 про UB переписали
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
bormand 11.11.2012 21:44 # 0
TarasB 11.11.2012 21:48 # 0
bormand 11.11.2012 21:25 # 0
Как же я теперь буду писать на сишечке... Все мои программы превратились в тыквуUB...
P.S. А что в этом коде не так - это ведь тоже самое, что и void *p = &p;
LispGovno 11.11.2012 21:27 # −1
LispGovno 11.11.2012 21:30 # 0
LispGovno 11.11.2012 21:31 # 0
bormand 11.11.2012 21:46 # 0
bormand 11.11.2012 21:30 # 0
LispGovno 11.11.2012 21:33 # 0
bormand 11.11.2012 21:38 # 0
А где в твоем примере нулевой указатель?
UPD: а, так ты код в посте обновил, в p2... ну вот значит в третьей строке UB, а в первой все норм, там никаких нуллов не разыменовывают.
bormand 11.11.2012 21:22 # 0
P.S. Разве что это имеет смысл если нужно воспользоваться "проскоком" с одной дефолтовой ветки на ту, которая ниже. http://ideone.com/bNUbad
LispGovno 11.11.2012 21:24 # 0
Ну это же очевидно. Обычная метка.
Gad Petrovich 11.11.2012 21:31 # 0
LispGovno 11.11.2012 21:39 # −2
TarasB 11.11.2012 21:48 # +2
TarasB 11.11.2012 22:19 # +2
LispGovno 11.11.2012 23:14 # 0
Я тебе хотел этот код прислать, но что-то с самого начала пошло не так. ты прав
bormand 11.11.2012 21:53 # +2
Я всегда буду обновлять тред перед отправкой.
Я всегда буду обновлять тред перед отправкой.
Я всегда буду обновлять тред перед отправкой.
TarasB 11.11.2012 22:00 # −1
Fai 11.11.2012 22:07 # +2
Эта мантра не помогает.
Gad Petrovich 11.11.2012 22:30 # +2
тут default можно ставить где угодно
defecate-plusplus 11.11.2012 22:47 # +3
LispGovno 11.11.2012 23:04 # +1
http://ideone.com/zz4sUi
bormand 12.11.2012 05:22 # 0
LispGovno 12.11.2012 07:56 # −1
roman-kashitsyn 12.11.2012 10:47 # 0
- Но зачем?
LispGovno 12.11.2012 11:19 # −1
roman-kashitsyn 12.11.2012 11:34 # 0
Например, я очень скептически отношусь к коммон-лисповому макросу loop (да, в нём слишком мало скобок :]), а синтаксис format, как уже замечал недавно @wvxvw, может вынести мозг любому.
LispGovno 12.11.2012 12:31 # −1
bormand 12.11.2012 11:34 # +4
Без дефолта: http://ideone.com/lMAqVQ, http://ideone.com/P9T4HM.
С дефолтом: http://ideone.com/OMftSs, http://ideone.com/9C7pyj.
С двумя дефолтами (статик ассёрт): http://ideone.com/BIdCfc.
LispGovno 11.11.2012 13:00 # −1
http://ideone.com/Kh4Nt9
Сравнивает строки.
А можно ввести ещё сравнение по предикату, притом можно сделать, что предикат в каждой строчке свой.
А ещё добавить наконец поддержку: case(1,5) заместо: case 1: case 2: case 3: case 4: case 5:.
Или добавить caseIn(List1), проверяющий принадлежность к листу.
Ну и конечно: