
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 58 59 [60] 61 62 ... 77 78 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#886
,
|
|
Ошибаешься, niXman. Это тоже стереотип. Массив символов - это массив, который хранит символы. Массив в первую очередь контейнер, хранящий элементы одного типа - в частности char или там char16_t итп - последовательно без перекрытий и пропусков. Строка по определению хранит только символы и ни что другое. И при этом как контейнер это отнюдь не массив. Она может быть представлена массивом, но отнюдь не обязательно.
В C не было типа строк, поэтому вместо них использовали почти исключительно массивы символов, которые на строки похожи. Т.к. строки в общем могут иметь произвольную длину, в частности определяемую в run-time, то в виду того, что динамические массивы в C нигде не хранят длину, решили строки хранить в ASCIIZ-форме, с NUL на конце, причём молчаливо предполагая, что как часть строки этот NUL использоваться не может. Не слишком ли много условностей? Этот стереотип так закрепился, что теперь мы все имеем две проблемы. Во-первых, std::basic_string<> свободен от всех недостатков C-строк. Это не массив, не ASCIIZ и без условностей NUL. Хранит любые символы, в любом количестве, как и любой контейнер знает, сколько он их хранит... в C++98-C++03 не было даже требования хранить символы последовательно. Собственно а зачем? Есть итераторы, есть индексация, для связи с legacy-кодом дали std::basic_string<>::data() и std::basic_string<>::c_str(), обе const, ибо они отнюдь не обязаны возвращать свой сторадж, тот вообще может быть представлен как угодно, например в виде списка деков, что весьма удобно для оптимизаций операций вставки/удаления/замещения частей строк, т.е. операций, ожидаемо часто выполняющихся над строками, в отличие от массивов. И оговорили условия, при которых возвращаемый ими std::basic_string<>::const_pointer перестаёт быть валидным. Во-вторых, стереотип настолько глубоко проник во всевозможные API, что представление строк в виде массивов стало чем-то само собой разумеющемся, в результате оказалось проще вернуть в C++11 гарантию последовательности хранения символов в std::basic_string<>. Пусть даже от стереотипа можно избавиться, программа по-любому часто взаимодействует с API, где эта непрерывность требуется, а постоянно юзать std::basic_string<>::data() const напрягает. Вот такие пироги. В заключение хочу напомнить, что непрерывность - та ну бог с ней, в других языках строки тоже зачастую непрерывны и в реализации, а не только внешне. Но строки всё-таки не массивы, а символы всё-таки не целые. И чтобы преобразовать одно в другое требуются касты, а то и вызовы RTL. Добавлено И это неправильно. Этот костыль - как и определение подобным образом bool - не в состоянии полностью удовлетворить требованиям Стандарта к ним. В частности будут проблемы при использовании их в качестве аргументов шаблонов или специализаций. Добавлено Чего я делал?? ![]() |
Сообщ.
#887
,
|
|
|
Что строкой вы назовете, то ей и будет
![]() |
![]() |
Сообщ.
#888
,
|
|
Цитата Qraizer @ Массив в первую очередь контейнер, хранящий элементы одного типа - в частности char или там char16_t итп - последовательно без перекрытий и пропусков. Строка по определению хранит только символы и ни что другое. И при этом как контейнер это отнюдь не массив. Тем более в utf8 например. |
Сообщ.
#889
,
|
|
|
Цитата Qraizer @ шаблона универсального решателя гм. не нашел. вроде был пост, в котором что-то вроде ![]() ![]() template <typename Result, typename Problem> Result solve (Problem args...); |
![]() |
Сообщ.
#890
,
|
|
А, понял
![]() |
Сообщ.
#891
,
|
|
|
А как обстоит дело в С++14 со static if ?
|
Сообщ.
#892
,
|
|
|
Цитата NeoApostol @ А как обстоит дело в С++14 со static if ? Никак. Последнее, что я видел - это критика static if Страуструпом (PDF). |
Сообщ.
#893
,
|
|
|
Цитата Kray74 @ Цитата NeoApostol @ А как обстоит дело в С++14 со static if ? Никак. Последнее, что я видел - это критика static if Страуструпом (PDF). А не подскажите, есть ли какая стороняя реализация этой штуки? Может в бусте? Я пока ничего не нашел |
Сообщ.
#894
,
|
|
|
Цитата NeoApostol @ есть ли какая стороняя реализация #if подойдет? Добавлено пожалуй единственное, чего нельзя сделать без static if это по сложному условию объявить глобальную переменную. остальное решаемо шаблонами |
![]() |
Сообщ.
#895
,
|
|
liss, а пример можно, когда нельзя его заменить?
|
Сообщ.
#896
,
|
|
|
Цитата liss @ Цитата NeoApostol @ есть ли какая стороняя реализация #if подойдет? мне для просто, что посоветуете ? Типа ![]() ![]() static if(std::is_empty<T>::value || std::is_empty<U>::value){ } else { } |
Сообщ.
#897
,
|
|
|
Цитата Qraizer @ Откуда в чистом C шаблоны? Или перегрузка функций? Я же писал о C, где char имело считать числовым типом, поскольку за его интерпретацию в любом случае отвечал самолично программист. В фортране хорошо было, можно было указать размер числа. И это неправильно. Этот костыль - как и определение подобным образом bool - не в состоянии полностью удовлетворить требованиям Стандарта к ним. В частности будут проблемы при использовании их в качестве аргументов шаблонов или специализаций. |
Сообщ.
#898
,
|
|
|
Цитата Qraizer @ liss, а пример можно, когда нельзя его заменить? не пользуясь препроцессором? |
![]() |
Сообщ.
#899
,
|
|
Не, когда static if нельзя заменить на шаблонны.
|
Сообщ.
#900
,
|
|
|
Цитата NeoApostol @ мне для просто, что посоветуете ? Типа ![]() ![]() static if(std::is_empty<T>::value || std::is_empty<U>::value){ } else { } Вызов функции с перегрузкой. ![]() ![]() void helper(....., std::integral_constant<bool, false>){ ... } void helper(....., std::integral_constant<bool, true>){ ... } helper(....., std::integral_constant<bool, std::is_empty<T>::value || std::is_empty<U>::value>()); Имхо static_if в данном случае был бы действительно приятнее. И ведь это самый простой вариант использования. Ну да, это решение в лоб, можно и другие варианты приглядеть, всё зависит от кода внутри if. Где-то можно использовать полную/частичную специализацию. |