- 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();
}
И вообще - если функция f принимает нужный тип и возвращает строку, и делает всю необходимую работу, нахрена вызывать ее опосредованно через toString?
судя по тому, что новый стандарт с легкостью был заимплеменчен вендорами за считанные недели после публикации
но optional не то чтобы был нужен настолько, что без него не писалось
вот сейчас сделал греп по всей папке work - найдено 0
просто личное мнение
std::string a=std::default; Так вызывается конструктор по умолчанию. Полезно в функциях с дефолт-параметрами. См ниже.
мне кажется, оно должно работать только при наличии конструктора от boost::none_t
вот это должно компилироваться? (взято по мотивам поста ниже)
http://liveworkspace.org/code/c02f8284daaa99860074080d8513236f
Да, именно так. Какой-нибудь тип std::default_t взять и написать во всех классах стандартной библиотеки конструктор от этого типа. Фактически эквивалентно конструктору по умолчанию должно быть. Это позволит юзать параметры по умолчанию в функциях.
Например: Соответственно данный код требует не импликит конструктора в std::function, что принимает в качестве параметра std::default_t.
Понятно, что можно юзать std::none и std::none_t, но я не уверен, что это кошерно. Это нарушит пост. Впрочем не мне решать.
В результате никаких ошибок связанных с исключениями или с заменяющими их костылями.
В других местах проблем это вызвать никак не может.
Ещё и не туда ответил:
http://govnokod.ru/11867#comment155262
Впрочем я как всегда не прав и большая часть слов, из тех что вы видели в цитате выше - уже перестанут употребляться.
И да, говна, кроме себя, не вижу.
show - аналог (std::stringstream()<<value).str()
fxd
почему не должно компилиться?
http://ideone.com/mBKfN
и зачем удалять?
В идеале потому что не будет работать ;)
> как это удалить из памяти?
Никак, его уже удалили за вас в деструкторе стд::стринга.
Если написано так: return ss.str().c_str();, то в данной функции никаких проблем не будет, если есть не эксплисит конструктор соответствующий у стринга.
>std::string toString(....)
Тк toString возращает std::string, то код выше заменится на соответствующий псевдокод:
return std::string(ss.str().c_str());
s=ss.str();
return s.c_str();
Тогда уж так:
Хотя в gcc есть __thread, да и в MSVC тоже должен быть аналог.
и всегда можно взять
http://www.boost.org/doc/libs/1_51_0/doc/html/thread/thread_local_storage.html
__declspec( thread ) static
ты ведь понимаешь, что стасик в твоем случае убивает не только приснопамятную многопоточность, но и возможность создать 2 таких объекта?
А thread_local на члены класса работает?
который 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 тоже будет способен
и это говорит крупнейший представитель защиты божественного Паскале-Ада-Дельфишного подхода объявлять все переменные кучей где то на расстоянии пары-тройки пейдж-апов
не где хошь, а только с помощью declare, начиная новый блок
но лучше, чем в паскале, согласен
технологии уровня с89
Какой же это тогда 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
Так это ж поле... А по видимости только внутри данного метода... а оно надо? Имхо запутает код, спрятав состояние, которое тем не менее будет влиять на работу кода.
Ну так ведь "TarasB: Я пишу на крестах". После такого троллинг на стороне крестов вполне резонен.
Ты осторожней, то скоро превратишься в того, кого годами обсирал.
Не. Это был наезд на жабу.
Типа жаба настолько уёбищное говно, что я ТарасБ пишу на блядских крестах. Нет, ну вы представляете насколько хуевым должен быть язык, чтобы заставить писать его на C++.
Зачем без статиков? Со статиками в классах, но не в методах.
Практически то же, что возвращать указатель на эл-т контейнера, который удален.
Ну указатель на эл-т контейнера вообще может сдуться на первой же модификации контейнера. Даже на вставке нового элемента в конец...
Предполагающей перераспределение памяти.
>Даже на вставке нового элемента в конец...
При добавлении в std::list вроде бы не должно.
Но в абстрактном контейнере - лучше перебдеть чем недобдеть ;)
toString (Just f) value = show $ f value
toString f = show . (maybe id f)
toString f value = show $ maybe (fromJust value) f value
- Не труъ
- Дважды написан show - опять же, не труъ
- Никаких суперпозиций. Никакого каррирования. Не труъ.
Что ты имеешь ввиду?
f . g (x) = f( g( x))
Если f будет обернут в Maybe, то не так. Если будет унарной функцией, то соберется, но тогда toString будет ожидать вторым аргументом тип Show a => Maybe a, что немного не попадает под изначальную задачу.