Russian Qt Forum
Ноябрь 01, 2024, 04:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Операторы для C структуры  (Прочитано 14888 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Сентябрь 06, 2015, 15:42 »

Во всех пользовательских функциях мы работаем с rgbLibF, поскольку для него все эти операции уже заточены..
Идея понятна, но
Теперь пишем шаблонные функции для работы с цветом, например:
Код
C++ (Qt)
template <class R, class T>
R combine_color(T c1, T c2, float w)
{
   rgbLibF c1 = color_cast<rgbLibF>(clr1);
   rgbLibF c2 = color_cast<rgbLibF>(clr2);
   return color_cast<R>( c1 * (1 - w) + c2 * w );  
}
 
Зачем тогда R и T? Все равно внутри конкретный rgbLibF и единственный T = Color. Может сделано в расчете что будет еще какое-то старье, тоже цвет? Ну это уж слишком "общо". И опять-таки обертка "только для 1 формулы".  Нет, все-таки правильно обеспечить операторы арифметики
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #31 : Сентябрь 06, 2015, 15:43 »

А разве rgbLibF - это не тот самый класс, который всё правильно делает?) 
Тогда его и нужно использовать везде везде везде, а по мере надобности кастовать в разные Color.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Сентябрь 06, 2015, 15:44 »

А разве rgbLibF - это не тот самый класс, который всё правильно делает?)  
Да, но он ничего не знает о старом Color. И rgbLibF библтотечный, хедер нельзя менять
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Сентябрь 06, 2015, 15:47 »

А разве rgbLibF - это не тот самый класс, который всё правильно делает?)  
Да, но он ничего не знает о старом Color. И rgbLibF библтотечный, хедер нельзя менять
Поэтому, нужно сделать свой класс MyColor, возможно он будет наследник rgbLibF, плюс операторы для приведения из MyColor в rgbLibF, Color, QColor, TheBestColor и все остальные колоры.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #34 : Сентябрь 06, 2015, 15:50 »

Цитировать
Зачем тогда R и T? Все равно внутри конкретный rgbLibF и единственный T = Color.
Как зачем? Я думал нужно уметь делать так, например:
Код
C++ (Qt)
rgbLibF c1, c2;
float w;
Color clr = combine_color(c1, c2, w);
...
Color c1, c2;
rgbLibF clr2 = combine_color(c1, c2, w);
 
и т.д..
 

Цитировать
Тогда его и нужно использовать везде везде везде, а по мере надобности кастовать в разные Color.
Согласен) Но я, кажется, уже опять начинаю не понимать, что же в конечном счёте хотел igors  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Сентябрь 06, 2015, 15:56 »

Но я, кажется, уже опять начинаю не понимать, что же в конечном счёте хотел igors  Улыбающийся
Так в этом вся прелесть. Поэтому, мне и нравиться играть с ним в его вопросы. Улыбающийся
Это как разговоры с доисторическим человеком: он пытается жестами объяснить, что ему нужно, а тебе его понять за меньшее количество шагов и наводящих вопросов. Улыбающийся
Записан
Bepec
Гость
« Ответ #36 : Сентябрь 06, 2015, 16:01 »

Рассеянное внимание, переключение с темы на тему, игнорирование ответов и это всё в одном флаконе Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Сентябрь 06, 2015, 16:22 »

Как зачем? Я думал нужно уметь делать так, например:
Код
C++ (Qt)
rgbLibF c1, c2;
float w;
Color clr = combine_color(c1, c2, w);
...
Color c1, c2;
rgbLibF clr2 = combine_color(c1, c2, w);
 
и т.д..
 
Это я и так сделаю, без всяких template - ведь в том что Вы привели типы задаются явно.

Согласен) Но я, кажется, уже опять начинаю не понимать, что же в конечном счёте хотел igors  Улыбающийся
Это ясно сказано в первом посте: обеспечить корректное выполнение выражения
Код
C++ (Qt)
return c1 * (1 - w) + c2 * w;
При условии что одним из инстанциированных типов может быть Color (см его объявление). Ну он же и должен возвращаться.

Проблема в том что предложенные решения, на мой взгляд, довольно многословный код, а с др стороны обеспечивают только одну формулу. Нет, пока она у меня только одна  Улыбающийся - но все-таки тут уместно вспомнить об общности. Что ж Вы рисуете combine_color, потом other_combine_color - ведь это все арифметические выражения
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #38 : Сентябрь 06, 2015, 17:03 »

Нет, пока она у меня только одна  Улыбающийся - но все-таки тут уместно вспомнить об общности. Что ж Вы рисуете combine_color, потом other_combine_color - ведь это все арифметические выражения
Так используйте правильный класс для цвета, который можно использовать в этих арифметических выражениях, у которого есть все необходимые операторы. А так же возможность приведения во все простые типы, типа Color.

А то туда и строки можно начать сувать и сокрушаться, что считается не очень правильно.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #39 : Сентябрь 06, 2015, 17:11 »

Цитировать
Это ясно сказано в первом посте: обеспечить корректное выполнение выражения
На что я предложил написать операторы для Color, но у Вас там возникли какие-то проблемы..
Потом, оказывается, есть rgbLibF, который это всё умеет..
Ну так в чём проблема:
Код
C++ (Qt)
const Color operator*(Color c, float x)
{
   rgbLibF clr = color_cast<rgbLibF>(c);
   return color_cast<Color>( clr * x );
}
 
const Color operator+(Color c1, Color c2)
{
   return color_cast<Color>( color_cast<rgbLibF>(c1) + color_cast<rgbLibF>(c2) );
}
 
Непонимающий

Цитировать
Так используйте правильный класс для цвета, который можно использовать в этих арифметических выражениях, у которого есть все необходимые операторы. А так же возможность приведения во все простые типы, типа Color.
Да, или так)

 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Сентябрь 07, 2015, 06:10 »

На что я предложил написать операторы для Color, но у Вас там возникли какие-то проблемы..
Потом, оказывается, есть rgbLibF, который это всё умеет..
Ну так в чём проблема:
Код
C++ (Qt)
const Color operator*(Color c, float x)
{
   rgbLibF clr = color_cast<rgbLibF>(c);
   return color_cast<Color>( clr * x );
}
 
const Color operator+(Color c1, Color c2)
{
   return color_cast<Color>( color_cast<rgbLibF>(c1) + color_cast<rgbLibF>(c2) );
}
 
Непонимающий
Это просто неверно, что толку считать во флотах если выход каждого оператора обрезается до uchar? Надо все выражение посчитать во флотах, а рез-т уже привести к Color. Но как мне это сделать? Напр я не могу написать
Код
C++ (Qt)
Color operator = ( const rgbLibF & src );
 
Т.к. этот оператор должен быть членом класса. Или в rgbLibF определить оператор Color - опять нужно членство. Вот о чем я спрашивал, а Вы какой-то, мягко говоря, "невнимательный"  Плачущий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #41 : Сентябрь 07, 2015, 07:35 »

 Это вы правильно подметили. Во всем виноват m_ax, точнее его "невнимательность".  Смеющийся  Смеющийся  Смеющийся
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.3 секунд. Запросов: 23.