Флейм
GameDev.ru / Флейм / Форум / Что даёт такой стиль кода , в чем его плюсы или минусы ? (2 стр)

Что даёт такой стиль кода , в чем его плюсы или минусы ? (2 стр)

Страницы: 1 2 3 48 Следующая »
gudleifrПостоялецwww9 июля 201823:40#15
werasaimon
> Я прекрасно понимаю что такое шаблоны. Мой вопрос небыл о том что значит этот
> код . Мой вопрос был зачем писать код так .
> Имееться виду не сами шаблоны, а именно весь код целиком !
Именно это я и имел в виду.
Есть задача - Вы ее решаете. Разбиваете на подздачи. Структурируете. Изобретаете новый язык... Не суть.
Важно только то, Ваша цель - не заморачиваться ничем кроме ее решения. Иначе Ваша задача станет сложнее, и как следствие - хуже (менее управляемой, более глючной и т.д.).
Поэтому ответ на Ваш вопрос: "Как писать?" только один - "Так, как надо для решения задачи".
Единого удобного стиля не существует. Это лишь отмазка для ниосиляторов, которые всю жизнь будут перекладывать свои кубики, но так ничего и не построят своего.
Будет Вам удобно иметь параметрические шаблоны - используйте. Будет удобнее сделать все на кондовых массивах - делайте. Добиться удобства вообще, заранее, на века - это утопия.

P.S. Есть у Вас начальник/гуру - пишите, как он велит. Есть подчиненный - давайте ему подзатыльники, как бы не написал.

Правка: 9 июля 2018 23:53

Vlad2001_MFSУчастникwww10 июля 20180:03#16
Delfigamer
Да, достаточно. Спасибо. Я такой шаблонной магией не владею, но на заметку обязательно возьму.

P.S Смотреть с телефона(экран 5.5) godbolt.org - это просто ад.

werasaimonПостоялецwww10 июля 201820:06#17
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> это два разных класса
war_zesПостоялецwww11 июля 20182:33#18
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;
};

Правка: 11 июля 2018 2:34

DelfigamerПостоялецwww11 июля 20183:17#19
war_zes
> мне до сих пор не понятно почему не могут такое сделать в стандарт:
А смысл?
war_zesПостоялецwww11 июля 20184:16#20
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 такое писать некрасиво - нарушает заповеди ООП (базовому классу приходится знать о предках - некузяво)

Правка: 11 июля 2018 4:20

SuslikМодераторwww11 июля 20184:20#21
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];
};
war_zesПостоялецwww11 июля 20184:23#22
Suslik
это выглядит уродливо (куча лишних скобок)
и вообще речь не о том как сделать. Это был просто пример моей мысли (и я почему-то уверен что такое есть в C#)

Правка: 11 июля 2018 4:24

DelfigamerПостоялецwww11 июля 20185:59#23
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 > >;
и тогда тебе будет полная объектная нирвана, абсолютная стабильность и вечное процветание.

Правка: 11 июля 2018 6:11

war_zesПостоялецwww11 июля 20186:19#24
Delfigamer
> Если тебя не волнует производительность, то в крестах подобный сахар делается
> легко и непринуждённо:
а теперь передай массив векторов в шейдер:)
к сожалению ссылки занимают память.

возможно можно передавать со смещениями (но ведь надо знать эти смещения, не говоря уже о производительности) - короче костыль на костыле, под костылем через костыль... тогда уж лучше никак не делать, а юзать f[] или x..w, независимо от контекста объекта

Delfigamer
> Ты неправильно наследуешь.
Ну ты же видишь разницу между парой сток и тем кодом что ты там нагромоздил?
Сахар, на то и сахар что позволяет писать изящно и мало строк кода

Тут речь была о том что мне не хватает такой фичи, а не как решить задачу.

(мой ленивый мозг не захотел парсить тот код - сложнА)

Правка: 11 июля 2018 6:22

DelfigamerПостоялецwww11 июля 20186:38#25
war_zes
> (мой ленивый мозг не захотел парсить тот код - сложнА)
Тогда не будет тебе нирваны. Медитируй ещё.

Правка: 11 июля 2018 6:38

SuslikМодераторwww11 июля 20187:11#26
war_zes
> это выглядит уродливо (куча лишних скобок)
ну если тебе нравится стрелять себе по ногам, то делай anonymous struct union да и всё, запрещает будто кто-то:
struct double3{
    union{
        struct{
            double x; 
            double y;
            double z;
        };
        double data[3];
    };
};

Правка: 11 июля 2018 12:56

Ghost2Постоялецwww11 июля 201812:38#27
Suslik

> ну если тебе нравится стрелять себе по ногам, то делай anonymous struct enum
В чем суть выстрела и при чем тут enum?

EugeneУчастникwww11 июля 201812:46#28
Ghost2
> В чем суть выстрела
Нестандартное расширение.
KartonagnickЗабаненwww11 июля 201813:45#29
werasaimon
> Что даёт такой стиль кода , в чем его плюсы или минусы ?

плюсы:
отсутствуют

минусы:
не скомпилируется.

Страницы: 1 2 3 48 Следующая »

/ Форум / Флейм / Программирование

2001—2018 © GameDev.ru — Разработка игр