- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
std::string toString(std::function<std::string(T)> f = std::function<std::string(T)>()) {
std::stringstream ss;
if(f)
ss << f(some_value);
else
ss << some_value;
return ss.str();
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+28
std::string toString(std::function<std::string(T)> f = std::function<std::string(T)>()) {
std::stringstream ss;
if(f)
ss << f(some_value);
else
ss << some_value;
return ss.str();
}
bormand 03.10.2012 21:08 # +1
И вообще - если функция f принимает нужный тип и возвращает строку, и делает всю необходимую работу, нахрена вызывать ее опосредованно через toString?
an0nym 03.10.2012 22:28 # 0
LispGovno 03.10.2012 22:33 # +1
bormand 04.10.2012 06:39 # +2
LispGovno 04.10.2012 09:13 # 0
defecate-plusplus 04.10.2012 09:24 # +2
LispGovno 04.10.2012 09:41 # +4
defecate-plusplus 04.10.2012 09:52 # +3
судя по тому, что новый стандарт с легкостью был заимплеменчен вендорами за считанные недели после публикации
LispGovno 04.10.2012 09:59 # 0
defecate-plusplus 04.10.2012 10:17 # +1
но optional не то чтобы был нужен настолько, что без него не писалось
вот сейчас сделал греп по всей папке work - найдено 0
просто личное мнение
LispGovno 04.10.2012 10:38 # 0
std::string a=std::default; Так вызывается конструктор по умолчанию. Полезно в функциях с дефолт-параметрами. См ниже.
defecate-plusplus 04.10.2012 10:54 # 0
мне кажется, оно должно работать только при наличии конструктора от boost::none_t
вот это должно компилироваться? (взято по мотивам поста ниже)
http://liveworkspace.org/code/c02f8284daaa99860074080d8513236f
LispGovno 04.10.2012 11:40 # 0
Да, именно так. Какой-нибудь тип std::default_t взять и написать во всех классах стандартной библиотеки конструктор от этого типа. Фактически эквивалентно конструктору по умолчанию должно быть. Это позволит юзать параметры по умолчанию в функциях.
Например: Соответственно данный код требует не импликит конструктора в std::function, что принимает в качестве параметра std::default_t.
Понятно, что можно юзать std::none и std::none_t, но я не уверен, что это кошерно. Это нарушит пост. Впрочем не мне решать.
Abbath 04.10.2012 17:23 # 0
LispGovno 04.10.2012 10:44 # 0
В результате никаких ошибок связанных с исключениями или с заменяющими их костылями.
rat4 03.10.2012 21:20 # +3
LispGovno 03.10.2012 21:55 # +1
В других местах проблем это вызвать никак не может.
absolut 03.10.2012 21:32 # +3
LispGovno 03.10.2012 22:00 # 0
Ещё и не туда ответил:
http://govnokod.ru/11867#comment155262
LispGovno 03.10.2012 22:04 # 0
Впрочем я как всегда не прав и большая часть слов, из тех что вы видели в цитате выше - уже перестанут употребляться.
makc3d 03.10.2012 22:33 # +4
LispGovno 03.10.2012 22:35 # +6
TarasB 03.10.2012 21:38 # 0
LispGovno 03.10.2012 21:53 # 0
LispGovno 03.10.2012 21:41 # +3
И да, говна, кроме себя, не вижу.
LispGovno 03.10.2012 21:51 # 0
show - аналог (std::stringstream()<<value).str()
LispGovno 03.10.2012 21:52 # 0
LispGovno 03.10.2012 21:56 # 0
LispGovno 03.10.2012 22:10 # +2
bormand 04.10.2012 06:41 # +2
absolut 04.10.2012 09:21 # +1
fxd
an0nym 03.10.2012 22:37 # +2
defecate-plusplus 03.10.2012 23:46 # +1
почему не должно компилиться?
http://ideone.com/mBKfN
и зачем удалять?
bormand 04.10.2012 06:43 # 0
В идеале потому что не будет работать ;)
> как это удалить из памяти?
Никак, его уже удалили за вас в деструкторе стд::стринга.
LispGovno 04.10.2012 09:19 # 0
Если написано так: return ss.str().c_str();, то в данной функции никаких проблем не будет, если есть не эксплисит конструктор соответствующий у стринга.
>std::string toString(....)
Тк toString возращает std::string, то код выше заменится на соответствующий псевдокод:
return std::string(ss.str().c_str());
bormand 04.10.2012 10:05 # 0
TarasB 04.10.2012 10:11 # 0
s=ss.str();
return s.c_str();
bormand 04.10.2012 10:12 # +4
Тогда уж так:
TarasB 04.10.2012 10:55 # +2
LispGovno 04.10.2012 11:32 # 0
LispGovno 04.10.2012 11:33 # +1
bormand 04.10.2012 14:41 # 0
Хотя в gcc есть __thread, да и в MSVC тоже должен быть аналог.
defecate-plusplus 04.10.2012 14:45 # +2
и всегда можно взять
http://www.boost.org/doc/libs/1_51_0/doc/html/thread/thread_local_storage.html
LispGovno 04.10.2012 15:09 # +1
__declspec( thread ) static
absolut 04.10.2012 12:00 # +2
TarasB 04.10.2012 14:26 # 0
defecate-plusplus 04.10.2012 14:32 # 0
TarasB 04.10.2012 15:11 # +1
defecate-plusplus 04.10.2012 15:29 # +2
ты ведь понимаешь, что стасик в твоем случае убивает не только приснопамятную многопоточность, но и возможность создать 2 таких объекта?
LispGovno 04.10.2012 15:55 # 0
А thread_local на члены класса работает?
defecate-plusplus 04.10.2012 16:08 # 0
который c++11?
7.1.1/4
The thread_local specifier indicates that the named entity has thread storage duration (3.7.2). It shall be applied only to the names of variables of namespace or block scope and to the names of static data members.
When thread_local is applied to a variable of block scope the storage-class-specifier static is implied if it does not appear explicitly.
не знаю, как трактовать and - реальной поддержки компиляторами thread_local сейчас нет, нечем проверить
edit видимо, трактовать как "применяется только к тому то и к тому то", так что всё ок. /edit
а так как __declspec(thread) и __thread применяются к статическим членам класса, так что думаю и thread_local тоже будет способен
TarasB 04.10.2012 16:07 # +1
defecate-plusplus 04.10.2012 16:15 # +3
и это говорит крупнейший представитель защиты божественного Паскале-Ада-Дельфишного подхода объявлять все переменные кучей где то на расстоянии пары-тройки пейдж-апов
TarasB 04.10.2012 16:33 # +2
defecate-plusplus 04.10.2012 16:43 # +2
не где хошь, а только с помощью declare, начиная новый блок
но лучше, чем в паскале, согласен
технологии уровня с89
TarasB 04.10.2012 16:08 # +2
3.14159265 04.10.2012 16:53 # +2
Какой же это тогда static? Обычное поле.
PS. В VB вроде такая херь была. Я только один раз, лет 10 назад юзал. А так никогда особо не пользовался.
You can use Static only on local variables. This means the declaration context for a Static variable must be a procedure or a block within a procedure, and it cannot be a source file, namespace, class, structure, or module.
You can use Static only on local variables. This means the declaration context for a Static variable must be a procedure or a block within a procedure, and it cannot be a source file, namespace, class, structure, or module.
http://msdn.microsoft.com/en-us/library/z2cty7t8(v=vs.80).aspx
bormand 04.10.2012 18:00 # +1
Так это ж поле... А по видимости только внутри данного метода... а оно надо? Имхо запутает код, спрятав состояние, которое тем не менее будет влиять на работу кода.
TarasB 04.10.2012 18:27 # +8
bormand 04.10.2012 19:03 # +3
Ну так ведь "TarasB: Я пишу на крестах". После такого троллинг на стороне крестов вполне резонен.
3.14159265 04.10.2012 19:05 # +2
Ты осторожней, то скоро превратишься в того, кого годами обсирал.
LispGovno 04.10.2012 20:03 # +3
3.14159265 04.10.2012 21:48 # +4
Не. Это был наезд на жабу.
Типа жаба настолько уёбищное говно, что я ТарасБ пишу на блядских крестах. Нет, ну вы представляете насколько хуевым должен быть язык, чтобы заставить писать его на C++.
LispGovno 04.10.2012 22:07 # 0
absolut 04.10.2012 15:42 # +3
bormand 04.10.2012 14:33 # +1
Зачем без статиков? Со статиками в классах, но не в методах.
absolut 04.10.2012 10:33 # +1
Практически то же, что возвращать указатель на эл-т контейнера, который удален.
bormand 04.10.2012 10:37 # +2
Ну указатель на эл-т контейнера вообще может сдуться на первой же модификации контейнера. Даже на вставке нового элемента в конец...
absolut 04.10.2012 11:10 # +2
Предполагающей перераспределение памяти.
>Даже на вставке нового элемента в конец...
При добавлении в std::list вроде бы не должно.
bormand 04.10.2012 12:35 # 0
Но в абстрактном контейнере - лучше перебдеть чем недобдеть ;)
guest 13.10.2012 14:40 # −1
toString (Just f) value = show $ f value
guest 13.10.2012 15:17 # −1
guest 13.10.2012 15:55 # −1
toString f = show . (maybe id f)
guest 13.10.2012 15:58 # −1
toString f value = show $ maybe (fromJust value) f value
guest 13.10.2012 16:01 # −1
guest 13.10.2012 16:22 # −1
- Не труъ
- Дважды написан show - опять же, не труъ
- Никаких суперпозиций. Никакого каррирования. Не труъ.
guest 13.10.2012 16:53 # −1
Что ты имеешь ввиду?
guest 13.10.2012 17:28 # −1
f . g (x) = f( g( x))
guest 13.10.2012 17:46 # −1
guest 13.10.2012 18:00 # −1
guest 13.10.2012 16:20 # −1
Если f будет обернут в Maybe, то не так. Если будет унарной функцией, то соберется, но тогда toString будет ожидать вторым аргументом тип Show a => Maybe a, что немного не попадает под изначальную задачу.