Re[10]: wstring как аргумент ф-ции
От: Were  
Дата: 14.11.08 16:04
Оценка: 1 (1) +2
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Were, Вы писали:


8>Вы тоже так пишете ? А-а-а, их становиться все больше !


8>Тут дело не в логике. Вот так "wchar_t const * cstr" пишет реально очень малое количество людей.

8>И "const wchar_t * cstr" пролетает и даже глаз не цепляется.
8>На ваших же примерах с двумя\тремя\указателями\const
8>глаз так и так зацепиться, и не важно где стоит const, и правильно сделает.

Честно говоря, раньше я тоже писал "const wchar_t *" и постоянно путался с объявлением нужной мне константности. Как только стал использовать запись "wchar_t const *" все стало на свои места, так как запись логична и не требует тупого запоминания )
Re[8]: wstring как аргумент ф-ции
От: VoidEx  
Дата: 14.11.08 15:53
Оценка: 1 (1)
Здравствуйте, 8bit, Вы писали:

8>ИМХО, если это у человека такая привычка, то лучше переучиться...


А потом люди удивляются, почему это у них тут не то, что они хотели:
typedef char * PCHAR;
typedef const PCHAR CPCHAR; // oops! not const char *, but char * const!

А если наоборот, то и читается как надо в обратном порядке, и проблемы, как выше, в сознании людей не возникает.
Re[7]: wstring как аргумент ф-ции
От: 8bit  
Дата: 14.11.08 15:27
Оценка: :)
Здравствуйте, Ovl, Вы писали:

Ovl>"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"


Это понятно. А вот чем обусловлен выбор писать "wchar_t const * cstr" не понятно.
Я достаточно много чужого кода видел, такое ну очень редко встречается. Вот и спрашиваю.
Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель?
А когда написано "const wchar_t * cstr" то такое читается автоматом.
ИМХО, если это у человека такая привычка, то лучше переучиться...
Re[9]: wstring как аргумент ф-ции
От: 8bit  
Дата: 14.11.08 16:54
Оценка: +1
Здравствуйте, VoidEx, Вы писали:

VE>А потом люди удивляются, почему это у них тут не то, что они хотели:

VE>
VE>typedef char * PCHAR;
VE>typedef const PCHAR CPCHAR; // oops! not const char *, but char * const!
VE>

VE>А если наоборот, то и читается как надо в обратном порядке, и проблемы, как выше, в сознании людей не возникает.

просто надо знать как typedef работает.
Re[12]: wstring как аргумент ф-ции
От: VoidEx  
Дата: 17.11.08 13:50
Оценка: +1
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, VoidEx, Вы писали:


8>>>просто надо знать как typedef работает.

VE>>Это не аргумент. Аргумент то, что при другом способе записи работа typedef становится очевидной

8>Вот не разу это не так. Не юлите.


Я бы вас упрекнул в незнании смысла слова "юлить", но не буду.

8>По вашей логике получается что если человек написал "typedef PCHAR const CPCHAR",

8>то для него будет очевидным что "typedef const PCHAR CPCHAR" тоже самое?

Нет. Для него будет очевидным, что вверху записано "typedef char * const CPCHAR".
При незнании тайпдефа внизу он увидит "typedef const char * CPCHAR" и ошибётся. Соот-но верхний вариант в заблуждение его не введёт.
Это первый, спорный и субъективный аргумент.
А есть второй (тоже субъективный, разумеется):
const char * const p1; // константный указатель на чар константный
char const * const p2; // константный указатель на константный чар

Я привык читать так, как внизу, хотя ясно, что в достаточно нетривиальных случаях это не прокатит,
но в своё время я изменил способ записи именно поэтому. Потому что неясно почему то слева надо const писать, то справа.
А так всегда справа. И от метода тоже справа.

8>Это не так. Если человек не понимает как работает typedef , то ничего очевидного тут нет,

8>как const не пиши. Это просто совпадение, что в первом варианте ваша точка зрения совпадает
8>с тем как работает typedef

К сожалению нет в близкой досягаемости людей, на которых можно было бы провести опыт, но
текстуальная замена запоминается и понимается почему-то проще, хотя и не верна в общем случае.
wstring как аргумент ф-ции
От: Serenadio  
Дата: 14.11.08 14:39
Оценка:
Здравствуйте!
Я программист в индустрии casual компьютерных игр. У нас в игровом движке и игровом коде используется std::wstring и
многие ф-ции принимают строки как wstring const &.
Я подумал, что более правильно будет принимать тип wchar_t const * в качестве типов аргументов для тех функций, которые не меняют содержимое (их подавляющее большинство).
Тогда вместо
void A::Find( wstring const & str )

будет
void A::Find( wchar_t const * cstr )

и для вызовов вида a.Find( L"some wide string" ) не будет создаваться лишняя строка.
Что скажете?
Прошу заметить, в наших проектах производительность и соотвествие "Саттеру/Александреску" не являются приоритетными.

Спасибо!
c++ gamedev
Re: wstring как аргумент ф-ции
От: zaufi Земля  
Дата: 14.11.08 14:47
Оценка:
Здравствуйте, Serenadio, Вы писали:

S>Здравствуйте!

S>Я программист в индустрии casual компьютерных игр. У нас в игровом движке и игровом коде используется std::wstring и
S>многие ф-ции принимают строки как wstring const &.
S>Я подумал, что более правильно будет принимать тип wchar_t const * в качестве типов аргументов для тех функций, которые не меняют содержимое (их подавляющее большинство).
S>Тогда вместо
S>
S>void A::Find( wstring const & str )
S>

S>будет
S>
S>void A::Find( wchar_t const * cstr )
S>

S>и для вызовов вида a.Find( L"some wide string" ) не будет создаваться лишняя строка.
S>Что скажете?
S>Прошу заметить, в наших проектах производительность и соотвествие "Саттеру/Александреску" не являются приоритетными.

не вижу смысл всего этого... если производительность не приоритет то создание временного wstring тоже не должно смущать
вопщем не понятна цель изменения всего этого?? ЗАЧЕМ?!! чего хочется достичь? перемешать в кучу интерфейсы в стиле С и С++? усложнить сопровождение кода? внести новых багов?
Re[2]: wstring как аргумент ф-ции
От: Serenadio  
Дата: 14.11.08 14:51
Оценка:
Z>не вижу смысл всего этого... если производительность не приоритет то создание временного wstring тоже не должно смущать
Z>вопщем не понятна цель изменения всего этого?? ЗАЧЕМ?!! чего хочется достичь? перемешать в кучу интерфейсы в стиле С и С++? усложнить сопровождение кода? внести новых багов?
Да, получается что я и сам ответил на свой вопрос. Спасибо!
Re[3]: wstring как аргумент ф-ции
От: 8bit  
Дата: 14.11.08 14:55
Оценка:
Здравствуйте, Serenadio, Вы писали:

Почему
void A::Find( wstring const & str ) и void A::Find( wchar_t const * cstr )
вместо
void A::Find( const wstring & str ) и void A::Find( const wchar_t * cstr )
Re[4]: wstring как аргумент ф-ции
От: Serenadio  
Дата: 14.11.08 15:06
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Serenadio, Вы писали:


8>Почему

8>void A::Find( wstring const & str ) и void A::Find( wchar_t const * cstr )
8>вместо
8>void A::Find( const wstring & str ) и void A::Find( const wchar_t * cstr )
Без разницы
Re[5]: wstring как аргумент ф-ции
От: 8bit  
Дата: 14.11.08 15:09
Оценка:
Здравствуйте, Serenadio, Вы писали:

S>Без разницы


Как это без разницы?
Re[6]: wstring как аргумент ф-ции
От: Ovl Россия  
Дата: 14.11.08 15:19
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Serenadio, Вы писали:


S>>Без разницы


8>Как это без разницы?


"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[6]: wstring как аргумент ф-ции
От: TheBeard Россия  
Дата: 14.11.08 15:20
Оценка:
S>>Без разницы

8>Как это без разницы?


Совершенно без разницы. Разница будет, если const поставить после звездочки или амперсанда.
Re[8]: wstring как аргумент ф-ции
От: Serenadio  
Дата: 14.11.08 15:34
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Ovl, Вы писали:


Ovl>>"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"


8>Это понятно. А вот чем обусловлен выбор писать "wchar_t const * cstr" не понятно.

8>Я достаточно много чужого кода видел, такое ну очень редко встречается. Вот и спрашиваю.
8>Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель?
8>А когда написано "const wchar_t * cstr" то такое читается автоматом.
8>ИМХО, если это у человека такая привычка, то лучше переучиться...
И то и другое читается автоматом
Re[8]: wstring как аргумент ф-ции
От: Were  
Дата: 14.11.08 15:37
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Ovl, Вы писали:


Ovl>>"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"


8>Это понятно. А вот чем обусловлен выбор писать "wchar_t const * cstr" не понятно.

8>Я достаточно много чужого кода видел, такое ну очень редко встречается. Вот и спрашиваю.
8>Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель?
8>А когда написано "const wchar_t * cstr" то такое читается автоматом.
8>ИМХО, если это у человека такая привычка, то лучше переучиться...

Как раз таки в записи "const wchar_t * cstr" логика отсутствует. В записи же "wchar_t const * cstr" модификатор const ставится после сущности, которая должна быть константной.

Для примера возьмем wchar_t * * pcstr:
Указатель на указатель на константный символ:
wchar_t const * * pcstr;

Константный указатель на указатель на символ:
wchar_t * * const pcstr;

Константный указатель на константный указатель на символ:
wchar_t * const * const pcstr;

Просто читать надо с конца, тогда все встанет на свои места.
Даже у методов модификатор const ставится в конце.
Re[9]: wstring как аргумент ф-ции
От: 8bit  
Дата: 14.11.08 15:58
Оценка:
Здравствуйте, Were, Вы писали:

Вы тоже так пишете ? А-а-а, их становиться все больше !

Тут дело не в логике. Вот так "wchar_t const * cstr" пишет реально очень малое количество людей.
И "const wchar_t * cstr" пролетает и даже глаз не цепляется.
На ваших же примерах с двумя\тремя\указателями\const
глаз так и так зацепиться, и не важно где стоит const, и правильно сделает.
Re[10]: wstring как аргумент ф-ции
От: Ovl Россия  
Дата: 14.11.08 16:41
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Were, Вы писали:


8>Вы тоже так пишете ? А-а-а, их становиться все больше !


8>Тут дело не в логике. Вот так "wchar_t const * cstr" пишет реально очень малое количество людей.

8>И "const wchar_t * cstr" пролетает и даже глаз не цепляется.
8>На ваших же примерах с двумя\тремя\указателями\const
8>глаз так и так зацепиться, и не важно где стоит const, и правильно сделает.

если бы всегда писали справа налево, то мир был бы проще, и не пришлось бы напрягаться каждый раз разбирая длинный wtf
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[10]: wstring как аргумент ф-ции
От: Were  
Дата: 14.11.08 17:12
Оценка:
Здравствуйте, 8bit, Вы писали:

8>просто надо знать как typedef работает.


Что-то я так и не увидел аргументов в поддержку записи "const char *", кроме "так принято" )
Re[11]: wstring как аргумент ф-ции
От: Serenadio  
Дата: 14.11.08 17:54
Оценка:
Здравствуйте, Were, Вы писали:

W>Здравствуйте, 8bit, Вы писали:


8>>просто надо знать как typedef работает.


W>Что-то я так и не увидел аргументов в поддержку записи "const char *", кроме "так принято" )


Друзья, это почти холивар. Самое лучшее, если вы одинаково хорошо читаете оба варианта.
Re[10]: wstring как аргумент ф-ции
От: VoidEx  
Дата: 14.11.08 18:45
Оценка:
Здравствуйте, 8bit, Вы писали:

8>просто надо знать как typedef работает.

Это не аргумент. Аргумент то, что при другом способе записи работа typedef становится очевидной, а значит что-то становится проще.
В любом случае "глаз цепляется" исключительно субъективное. У меня наоборот цепляется за char const *.

П.С. Я разумеется не собираюсь доказывать, что этот стиль лучше, я лишь опровергаю, что он хуже.
Re[11]: wstring как аргумент ф-ции
От: 8bit  
Дата: 17.11.08 12:03
Оценка:
Здравствуйте, VoidEx, Вы писали:

8>>просто надо знать как typedef работает.

VE>Это не аргумент. Аргумент то, что при другом способе записи работа typedef становится очевидной

Вот не разу это не так. Не юлите.
По вашей логике получается что если человек написал "typedef PCHAR const CPCHAR",
то для него будет очевидным что "typedef const PCHAR CPCHAR" тоже самое?
Это не так. Если человек не понимает как работает typedef , то ничего очевидного тут нет,
как const не пиши. Это просто совпадение, что в первом варианте ваша точка зрения совпадает
с тем как работает typedef
Re[13]: wstring как аргумент ф-ции
От: 8bit  
Дата: 17.11.08 15:07
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Я привык читать так, как внизу

Да, у Страуструпа так и написано: "Некоторые люди читают такие обьявления справа на лево"

Про typedef аргумент не очень, потому что человек должен знать как он работает,
а то получается что человек возможно не делает ошибки в обьявлении типа, не потому
что он понимает как это работает, а потому что он пишет const ровно перед звездочкой.

В итоге получается есть только ваш субьективный аргумент:
"Я привык читать так" супротив моего мнения, что "это не привычно для большинства",
и если код пишется не только для себя, то другим может быть не легко читать такой код.

>Потому что неясно почему то слева надо const писать, то справа.

Почему не ясно?
Цитирую: "Оператор обьявления, который делает указатель константой, — это *const.
Нет оператора обьявления const*, поэтому ключевое слово const слева от * интерпретируется
как часть базового типа."

Re[8]: wstring как аргумент ф-ции
От: igna Россия  
Дата: 17.11.08 15:33
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель?

8>А когда написано "const wchar_t * cstr" то такое читается автоматом.

Причина того, что думать приходится, вовсе не в том, что способ записи объективно хуже, просто последний тебе непривычен. Объективно он наоборот лучше, аргументы тут уже приводили, можешь еще Александреску почитать.
Re[14]: wstring как аргумент ф-ции
От: VoidEx  
Дата: 17.11.08 20:03
Оценка:
Здравствуйте, 8bit, Вы писали:

>>Потому что неясно почему то слева надо const писать, то справа.

8>Почему не ясно?
8>Цитирую: "Оператор обьявления, который делает указатель константой, — это *const.
8>Нет оператора обьявления const*, поэтому ключевое слово const слева от * интерпретируется
8>как часть базового типа."

Сложно как-то. У меня проще. Слева от const то, что константно. Если слева *, то указатель константен. Если int, то само число.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.