- 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;
}
Для сортировок часто в качестве операций выбирают требуемое число сравнений, именно, его и привёл борманд (правда, в вики n! * (n-1)).
при желании, можно сделать хелпер is_defaulth<T>, который для Defaulth перегрузкой будет иметь enum { valueh = trueh; }, а для всех остальных - falseh, и от него плясать (первую часть не отменяет, зато можно извратиться и дефолтх отложить на последнюю очередь, заодно проверить, чтобы их было не больше одного)
Дефейкейстры
http://ideone.com/j1sxa2
Согласен. Пофиксил.
http://ideone.com/4ROpgg
Причем то, что defaulht стоит последним проверяется на этапе компиляции: http://ideone.com/G9FfN0
PS: Ошибка не говорящая совершенно. static_assert бы туда...
За счет несравнимости Defaulht с другими типами.
в целом он какой-то broken этот static_assert, я не смог его заставить заработать на моем пыщь пыщь говнокоде
при этом я уронил liveworkspace.org, и теперь проверить поведение на BOOST_STATIC_ASSERT пока негде
в общем вот такой вот говнокот:
http://ideone.com/bpRJVI
если поставить defau1t последним, то г++ инстанциируя do_case<true>(f, args...) сделает непотребность в виде do_case<true>(f, defau1t, f, {}), и конечно стасик_ассерт заругает
что с этим делать?
еще интересней: http://ideone.com/N0ZuP5
sorry, unimplemented
http://ideone.com/e7vZTr
http://ideone.com/PABJQf
типа о ((mytype *)0)->foo()
P.S. Сейчас пороемся в стандартах.
В стандарте нет понятия креш. На некоторых платформах и средах будут испорчены вектора прерываний или ещё что-нибудь. Это есть UB по стадарту.
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.
Вот и я думаю, что это не уб. уб начнется, когда с значением расположеным по этому указателю что-то начнешь делать, то есть &*c - не уб
они даже п.1.9 про UB переписали
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
Как же я теперь буду писать на сишечке... Все мои программы превратились в тыквуUB...
P.S. А что в этом коде не так - это ведь тоже самое, что и void *p = &p;
А где в твоем примере нулевой указатель?
UPD: а, так ты код в посте обновил, в p2... ну вот значит в третьей строке UB, а в первой все норм, там никаких нуллов не разыменовывают.
P.S. Разве что это имеет смысл если нужно воспользоваться "проскоком" с одной дефолтовой ветки на ту, которая ниже. http://ideone.com/bNUbad
Ну это же очевидно. Обычная метка.
Я тебе хотел этот код прислать, но что-то с самого начала пошло не так. ты прав
Я всегда буду обновлять тред перед отправкой.
Я всегда буду обновлять тред перед отправкой.
Я всегда буду обновлять тред перед отправкой.
Эта мантра не помогает.
тут default можно ставить где угодно
http://ideone.com/zz4sUi
- Но зачем?
Например, я очень скептически отношусь к коммон-лисповому макросу loop (да, в нём слишком мало скобок :]), а синтаксис format, как уже замечал недавно @wvxvw, может вынести мозг любому.
Без дефолта: http://ideone.com/lMAqVQ, http://ideone.com/P9T4HM.
С дефолтом: http://ideone.com/OMftSs, http://ideone.com/9C7pyj.
С двумя дефолтами (статик ассёрт): http://ideone.com/BIdCfc.
http://ideone.com/Kh4Nt9
Сравнивает строки.
А можно ввести ещё сравнение по предикату, притом можно сделать, что предикат в каждой строчке свой.
А ещё добавить наконец поддержку: case(1,5) заместо: case 1: case 2: case 3: case 4: case 5:.
Или добавить caseIn(List1), проверяющий принадлежность к листу.
Ну и конечно: