- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
struct Point3D {
float x,y,z;
float& operator [] (int i) {
switch (i) {
case 0: return x;
case 1: return y;
case 2: return z;
default: assert(false);
}
}
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+15
struct Point3D {
float x,y,z;
float& operator [] (int i) {
switch (i) {
case 0: return x;
case 1: return y;
case 2: return z;
default: assert(false);
}
}
};
Писал Жабапоглащенный.
Xom94ok 08.01.2014 19:51 # 0
LispGovno 08.01.2014 19:54 # 0
А что ты с Жабапоглощенного хотел?
я за .x();, .y(); ... и [].
Xom94ok 08.01.2014 19:59 # 0
http://habrahabr.ru/post/121799/
bormand 08.01.2014 20:02 # +7
Наверное, все любители языка C++, которые использовали другие языки, такие как C#, удивляются: почему же в плюсах нет {{feature.name}}? Ведь это действительно удобное средство, позволяющее {{feature.description}}. Недавно и я заинтересовался данным вопросом. Подумав, полистав Страуструпа и наконец, погуглив, я пришёл к выводу, что {{feature.name}} можно реализовать средствами языка...
roman-kashitsyn 08.01.2014 20:12 # +4
Vindicar 08.01.2014 20:36 # +2
anonimb84a2f6fd141 08.01.2014 20:45 # 0
Синдром Бабла.
LispGovno 08.01.2014 20:49 # 0
LispGovno 08.01.2014 21:39 # +2
Синдром блаблабла - это когда питушок не признает фичи языка из другого языка. Тут чувак имеет фичу (то есть находиться как бы в языке более высокого уровня по наличию фичи) и пытается сэмулировать в крестах. Он не говорит, что фича не нужна. Он говорит что её можно использовать, а это уже не является синдромом блаба. Синдром блаба - семантическая слепота.
TarasB 09.01.2014 09:10 # 0
Задрал этот ёбаный понос m_size, size(), m_length, length(), это уёбищное () везде писать.
LispGovno 09.01.2014 09:29 # +1
Тебя проклял кто-то
Страуструп
LispGovno 08.01.2014 20:10 # 0
Из-за очень возможного 100% оверхеда по памяти, а ты предлагаешь:
на каждый член
WGH 08.01.2014 20:12 # 0
LispGovno 08.01.2014 20:24 # 0
LispGovno 08.01.2014 20:29 # 0
roman-kashitsyn 08.01.2014 20:40 # +2
bormand 08.01.2014 21:03 # 0
roman-kashitsyn 08.01.2014 21:17 # 0
bormand 08.01.2014 21:22 # 0
Шарповые свойства это же всего лишь синтаксический сахар, не более того.
От них профит только в том, что кода меньше писать, чем врукопашную делать геттер и сеттер. Ну и вызов на две скобки короче.
Безнаказанно рефакторить поля на свойства, без перекомпиляции классов, использующих данный, емнип, они в шарпе все равно не позволяют, т.к. поломается интерфейс класса. Но я могу ошибаться. Шарпеи, вы где?
P.S. Да, у меня синдром Блаба, и я не признаю удобство свойств.
bormand 08.01.2014 21:32 # 0
Так что, имхо, не нужны они в крестах.
=== BEGIN HOLY WAR ===
WGH 08.01.2014 21:34 # 0
bormand 08.01.2014 21:42 # +2
Во-вторых мы теряем полиморфизм (хотя мы его уже потеряли из-за требования на standard-layout или POD). Свойство не сможет понять, встроено оно в класс A, или в его потомка - класс B.
Во-вторых надо бы проверить, можно ли это смещение вычислить на уровне шаблонов. Т.к. хранить его - тот же самый оверхед, и проще, имхо, хранить указатель.
P.S. Или я туплю?
LispGovno 08.01.2014 21:46 # 0
Abbath 09.01.2014 01:33 # +2
LispGovno 08.01.2014 21:43 # 0
bormand 08.01.2014 21:43 # +2
LispGovno 19.01.2014 17:34 # 0
roman-kashitsyn 19.01.2014 19:05 # 0
LispGovno 19.01.2014 19:07 # +1
Xom94ok 08.01.2014 21:44 # 0
Еще как избежен!
1. можно инкапсулировать данные в самом свойстве, а не в родителе. Родителя, соответственно, зафрендить.
2. указатель на родительский объект получается в вычитанием из this объекта свойства некоторой константы.
bormand 08.01.2014 21:46 # +1
Очень ограниченно. Теряем половину профита от сеттеров. Разве что валидацию и read-only так можно замутить.
> 2. указатель на родительский объект получается в вычитанием из this объекта свойства некоторой константы.
И полиморфизм смывается в унитаз. Если я не туплю сегодня.
Xom94ok 08.01.2014 21:52 # +1
Таки да.
Пункт два - я тупанул, пустой класс тоже что-то весит.
bormand 08.01.2014 22:41 # 0
Или все-таки не смывается... Жарко дома, башка совсем не варит ;(
Пойду попробую реализовать.
bormand 08.01.2014 23:03 # 0
Фейл. offsetof(my_class, my_prop) нельзя передать как параметр шаблона для типа самого же my_prop. Что в общем-то логично ;(
У кого еще есть какие-нибудь предложения, как замутить свойство без хранения в нем ссылки на тот объект, в котором оно лежит?)
guest 10.01.2014 11:55 # +2
Проверено, работает
bormand 10.01.2014 13:10 # 0
Спасибо.
TarasB 09.01.2014 09:10 # 0
bormand 09.01.2014 10:28 # 0
В Qt, в принципе, прикрутили метасистему. Там к свойствам из js можно обращаться, просто дергать их по имени... Но она работает только на QObject'ах, и представляет собой жуткий костыль с генерацией дополнительной сишки.
TarasB 09.01.2014 10:58 # 0
bormand 09.01.2014 11:05 # 0
TarasB 09.01.2014 15:09 # 0
bormand 09.01.2014 15:23 # 0
Так что так просто не отделаться ;(
kegdan 08.01.2014 21:38 # 0
а вот и нет. теперь этот сахарок в ASP.net стал важен - вьюшка и контролер не могут с полями на автомате работать, только с свойствами.
нет, методами можно, но это выливается в анальную боль.
bormand 08.01.2014 21:48 # 0
> нет, методами можно
Ч.т.д. Сахар. Удобный, не спорю, но сахар.
kegdan 08.01.2014 22:00 # 0
bormand 08.01.2014 22:23 # 0
Тогда и структуры тоже сахар. Т.к. без этого "сахара" я не смогу описать структуру.
kegdan 08.01.2014 22:31 # +1
интересное и позновательное
в дотнете структуры преполагается юзать приимущественно в ансейвед коде, поэтому по умолчанию по порядок следования полей в структуре в памяти определяется юзером. Однако в классах порядок выбирается компилятором. Сменить метод расположения полей можно атрибутом
[StructLayout(LayoutKind.xxxx)]
Так же можно явно задать положение полей с помощью смещений памяти
Abbath 09.01.2014 02:06 # 0
int *a = malloc(size);
*(a+n) = something();
bormand 09.01.2014 06:05 # +2
Тем самым ты обходишься и без структур :)
Q.E.D.
TarasB 09.01.2014 09:16 # +1
А со свойствами смог бы, в геттерах-сеттерах считал бы указатель и возвращал ссылку на смещение.
kegdan 08.01.2014 21:47 # +2
правду глаголишь, боярин. Ибо метаданные разные. Свойство - это свойство, а поле - это поле. Свойство даже автоматеческое, всегда прячет за собой поле, пусть и неявно
bormand 08.01.2014 21:51 # 0
Ну скажем так, не всегда. Например если я делаю прямоугольник, и хочу сделать ему свойства left, right, width,то одно из них останется без переменной.
kegdan 08.01.2014 21:57 # 0
int x{get; set;}
то все равно создается поле, правда явно оно не доступно.
bormand 08.01.2014 22:12 # +1
Ну ок, я читаю значение свойства temperature с термометра, подключенного по 1-wire. Где оно хранится? )
kegdan 08.01.2014 22:16 # 0
В окружающей среде, естественно
А нахрена ему свойство? Мы будет градуснику по 1-wire температуру задавать?)
bormand 08.01.2014 22:39 # 0
Почему нет? Вдруг это какой-то управляемый термостат. Читаешь из свойства текущую температуру, записываешь желаемую ;)
kegdan 08.01.2014 22:41 # +2
kegdan 08.01.2014 22:12 # 0
Да уж персонально меня зови, один я у вас такой.)
Задавая умные вопросы, товарищ Борманд, вы таки заставляете меня луркать (так как я не могу ответить такому человеку как вы^_^) и тем самым заставляете меня учиться
bormand 08.01.2014 23:20 # +1
Кажется я был не прав. Конечно же свойства, геттеры\сеттеры и поля отличаются на уровне метаданных и видны через рефлексию именно как свойства.
Но в крестах нет рефлексии, так что пофиг.
LispGovno 08.01.2014 21:41 # 0
Оно небось бы и заинлайнилось. Жаль бы отвратительно выглядело и пропала бы возможность модификации гетеров сетеров, заменяющая виртуальные проперти
roman-kashitsyn 08.01.2014 21:55 # +1
Не монял мысли. Указатели на виртуальные методы никто не отменял.
bormand 08.01.2014 22:10 # 0
LispGovno 08.01.2014 22:11 # +1
ps: вопрошатель уже все понял
Vindicar 08.01.2014 20:43 # −1
Psionic 08.01.2014 22:15 # 0
TarasB 08.01.2014 20:53 # +2
не только твоё
оно всё-таки пооптимальнее
Psionic 08.01.2014 22:26 # 0
LispGovno 08.01.2014 23:25 # 0
bormand 08.01.2014 23:33 # +1
LispGovno 08.01.2014 23:57 # 0
bormand 09.01.2014 00:12 # 0
LispGovno 08.01.2014 23:28 # 0
Psionic 08.01.2014 23:33 # 0
bormand 08.01.2014 23:34 # +1
Индейцы вроде не помешают. Они же влияют только на порядок байт в том же флоате. Но никак не на порядок флоатов между собой.
bormand 08.01.2014 23:31 # 0
Ну и Тарас же не говорит, что эта реализация безопасна. Он только сказал, что она оптимальней.
> число i вне 0...2
Ну а что поделать? Либо проверка и теряем производительность зазря, либо нет проверки, но есть небольшой, но риск.
Можно конечно что-то типа такого запилить: p.get<0>(), но оно неюзабельно в циклах. А раз неюзабельно в циклах - вместо него можно юзать банальное p.x ;)
bormand 08.01.2014 23:40 # 0
Одно дело, когда этот индекс взят из внешних данных. Тогда проверка нужна.
И совсем другое дело, если этот индекс юзают только в десятке функций, оперерирующих над матрицами и векторами, и больше никто к ним никогда не полезет.
Я все-таки за то, чтобы выпилить этот оператор [] нахер, а в коде всяких умножений матриц юзать .x, .y, .z, анролльнув его вручную или простеньким скриптом на питоне. Зачем этот оператор нужен то, кроме лени автора либы и ее читабельности (на которую нам немного насрать, т.к. либа явно точится под производительность)?
bormand 08.01.2014 23:51 # 0
Координаты векторов и ячейки матриц, имхо, мало кому нужны кроме самой либы. А сама либа во френдзоне и работает с полями напрямую, поэтому скобочки мешать не будут.
TarasB 08.01.2014 20:52 # +3
bormand 08.01.2014 21:50 # +1
LispGovno 08.01.2014 23:54 # 0
Матрицы любят циклами на вектора перемножать
bormand 08.01.2014 23:58 # 0
LispGovno 09.01.2014 00:03 # 0
нафига руками
bormand 09.01.2014 00:04 # 0
r.x = m[0]*a.x + m[1]*a.y + m[2]*a.z
Вот на тачскрине даж набрал. Хули тут писать то.
LispGovno 09.01.2014 00:14 # 0
bormand 09.01.2014 00:32 # +5
LispGovno 09.01.2014 00:36 # +3
LispGovno 09.01.2014 00:30 # 0
Бывают и побольше вектора, а развернуть охота
bormand 09.01.2014 06:07 # 0
Ну вот там уже можно и развернуться :) Но там уже и проблем с .x, .y, .z не будет. Там уже будет простая и тупая индексация.