werasaimon
> Я прекрасно понимаю что такое шаблоны. Мой вопрос небыл о том что значит этот
> код . Мой вопрос был зачем писать код так .
> Имееться виду не сами шаблоны, а именно весь код целиком !
Именно это я и имел в виду.
Есть задача - Вы ее решаете. Разбиваете на подздачи. Структурируете. Изобретаете новый язык... Не суть.
Важно только то, Ваша цель - не заморачиваться ничем кроме ее решения. Иначе Ваша задача станет сложнее, и как следствие - хуже (менее управляемой, более глючной и т.д.).
Поэтому ответ на Ваш вопрос: "Как писать?" только один - "Так, как надо для решения задачи".
Единого удобного стиля не существует. Это лишь отмазка для ниосиляторов, которые всю жизнь будут перекладывать свои кубики, но так ничего и не построят своего.
Будет Вам удобно иметь параметрические шаблоны - используйте. Будет удобнее сделать все на кондовых массивах - делайте. Добиться удобства вообще, заранее, на века - это утопия.
P.S. Есть у Вас начальник/гуру - пишите, как он велит. Есть подчиненный - давайте ему подзатыльники, как бы не написал.
Delfigamer
Да, достаточно. Спасибо. Я такой шаблонной магией не владею, но на заметку обязательно возьму.
P.S Смотреть с телефона(экран 5.5) godbolt.org - это просто ад.
Vlad2001_MFS
> Great V.
> Я про этот вариант думал, но там же нужно будет вручную указывать x, y или x,
> y, z или вообще x, y, z, w. А ведь хочется чтобы все было автоматически.
> Написал
> typedef Vector<float, 3> Vector3f;
> и оно автоматом добавило туда переменные x, y, z.
Смысли вручную у тебя же есть два шаблоных класса
Vector<T, 2> и Vector<T , 3> .
Когда ты обявляешь
typedef Vector<float , 2> Vector2f ; тут две перименые (x,y)
typedef Vector< float , 3 > Vector3f ; а тут три перименые (x,y,z)
Видь Vector<T, 2> и Vector<T , 3> это два разных класса
Eugene
> Прямо - никак, кресты сасай.
мне до сих пор не понятно почему не могут такое сделать в стандарт:
struct My { public: using x = m[0]; using u = m[1]; using z = m[2]; using w = _w; private: int m[3]; int _w; };
war_zes
> мне до сих пор не понятно почему не могут такое сделать в стандарт:
А смысл?
Delfigamer
> А смысл?
синтаксический сахар. В с++ есть же возможность присваивать новое имя пространству имен, классу, функции (все эти typedef и using::). Почему нельзя было сделать для членов?
Удобно:
struct Float4 { float f[4]; }; struct ColorRGBA : public Float4 { using r = f[0]; using g = f[1]; using b = f[2]; using a = f[3]; }; struct Vector4 : public Float4 { using x = f[0]; using y = f[1]; using z = f[2]; using w = f[3]; };
Через union такое писать некрасиво - нарушает заповеди ООП (базовому классу приходится знать о предках - некузяво)
war_zes
> struct My
> {
> public:
> using x = m[0];
> using u = m[1];
> using z = m[2];
> using w = _w;
> private:
> int m[3];
> int _w;
> };
struct Your { int &x() {return m[0];} int &u( ) {return m[1];} int &z( ) {return m[2];} private: int m[3]; };
Suslik
это выглядит уродливо (куча лишних скобок)
и вообще речь не о том как сделать. Это был просто пример моей мысли (и я почему-то уверен что такое есть в C#)
war_zes
> (и я почему-то уверен что такое есть в C#)
Если тебя не волнует производительность, то в крестах подобный сахар делается легко и непринуждённо:
struct v3 { int elems[3]; int& x = elems[0]; int& y = elems[1]; int& z = elems[2]; };
war_zes
> Через union такое писать некрасиво - нарушает заповеди ООП (базовому классу
> приходится знать о предках - некузяво)
Ты неправильно наследуешь.
Если ещё хочется добавить общих членов внутрь класса - делай по типу
template< typename A, typename Alin = linear_traits< A > > struct smart_linear : T { using elemtype = typename Alin::elemtype; elemtype square() { elemtype r = elemtype{}; for( size_t i = 0; i < ALin::dims; ++i ) { r += Alin::elem( *this, i ) * Alin::elem( *this, i ); } return r; } }; template< typename T, size_t size > using smart_vector = smart_linear< vector< T, size > >;
Delfigamer
> Если тебя не волнует производительность, то в крестах подобный сахар делается
> легко и непринуждённо:
а теперь передай массив векторов в шейдер:)
к сожалению ссылки занимают память.
возможно можно передавать со смещениями (но ведь надо знать эти смещения, не говоря уже о производительности) - короче костыль на костыле, под костылем через костыль... тогда уж лучше никак не делать, а юзать f[] или x..w, независимо от контекста объекта
Delfigamer
> Ты неправильно наследуешь.
Ну ты же видишь разницу между парой сток и тем кодом что ты там нагромоздил?
Сахар, на то и сахар что позволяет писать изящно и мало строк кода
Тут речь была о том что мне не хватает такой фичи, а не как решить задачу.
(мой ленивый мозг не захотел парсить тот код - сложнА)
war_zes
> это выглядит уродливо (куча лишних скобок)
ну если тебе нравится стрелять себе по ногам, то делай anonymous struct union да и всё, запрещает будто кто-то:
struct double3{ union{ struct{ double x; double y; double z; }; double data[3]; }; };
Suslik
> ну если тебе нравится стрелять себе по ногам, то делай anonymous struct enum
В чем суть выстрела и при чем тут enum?
Ghost2
> В чем суть выстрела
Нестандартное расширение.
werasaimon
> Что даёт такой стиль кода , в чем его плюсы или минусы ?
плюсы:
отсутствуют
минусы:
не скомпилируется.
Тема в архиве.