Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Сентябрь 05, 2015, 13:13



Название: Операторы для C структуры
Отправлено: Igors от Сентябрь 05, 2015, 13:13
Добрый день

Есть хедеры либы на С, там объявлена такая структура
Код
C++ (Qt)
typedef union {
unsigned int value;
struct {
 unsigned char a, r, g, b;
} argb;
} Color;
В пучине уже моих темплейт есть такое
Код
C++ (Qt)
T c1, c2;
float weight;
...
return c1 * (1 - weight) + с2 * weight;
Конечно при попытке инстанциации T = Color это не компилится т.к. для структуры Color нет нужных операторов. Как это порешать?

Спасибо 


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 13:50
Цитировать
Конечно при попытке инстанциации T = Color это не компилится т.к. для структуры Color нет нужных операторов. Как это порешать?
Написать перегрузку для этих операторов?)

Код
C++ (Qt)
const Color operator*(Color c, float x)
{
   ...
}
 
const Color operator*(float x, Color x)
{
   ...
}
 


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 05, 2015, 14:37
Написать перегрузку для этих операторов?)
Но uchar не может хранить float.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 14:43
А 4 uchar'а ?)

Или я чего то не понимаю?)


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 05, 2015, 15:44
Или я чего то не понимаю?)
Конечно не понимаете, никто не понимает. Все нормально. :)

Но uchar не может хранить float.
В точку. Ну и что? Как это соотносится с оператором умножения?


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 05, 2015, 15:58
А 4 uchar'а ?)

Или я чего то не понимаю?)
Пример: даны 2 белых цвета argb = (255, 255, 255, 255) которые должны быть смешаны с весом 0.5 (т.е. среднее). Создавая операторы арифметики Color получаем (254, 254, 254, 254) - неверно.

Да, для простоты считаем что альфа всегда 255 (прозрачности нет) 


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 16:06
Цитировать
Пример: даны 2 белых цвета argb = (255, 255, 255, 255) которые должны быть смешаны с весом 0.5 (т.е. среднее). Создавая операторы арифметики Color получаем (254, 254, 254, 254) - неверно.
Ну мы это уже проходили.. То что там будет под капотом этих опереторов это, как уже заметил Old, совсем другой вопрос.)

Я бы  вообще не вводил арифметику для таких объектов, как color.. Дабы людей не смущать)
Лучше написать набор функций с говорящими названиями, имхо) 


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 05, 2015, 16:09
Отлично подобранный раздел для вопроса, ну как всегда. :)
Сложение мы проходили в 2010 и 2013 году:
http://www.prog.org.ru/topic_14700_0.html
http://www.prog.org.ru/topic_24054_0.html
сейчас дошли до умножения. :)

Пример: даны 2 белых цвета argb = (255, 255, 255, 255) которые должны быть смешаны с весом 0.5 (т.е. среднее). Создавая операторы арифметики Color получаем (254, 254, 254, 254) - неверно.
Тут, конечно, стоили бы сразу спросить, а как это посчитать правильно, с вашей точки зрения. Но мы развлекаемся, поэтому сразу предложу так:
Код
C++ (Qt)
const Color operator*( Color c, float x )
{
   Color res;
   res.argb.r = float( c.argb.r ) * x;
   res.argb.g = float( c.argb.g ) * x;
   res.argb.b = float( c.argb.b ) * x;
   return res;
}
 
 


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 05, 2015, 16:29
Я бы  вообще не вводил арифметику для таких объектов, как color.. Дабы людей не смущать)
Лучше написать набор функций с говорящими названиями, имхо)  
А так и есть - но это место в template коде (см первый пост)

Ну мы это уже проходили.. То что там будет под капотом этих опереторов это, как уже заметил Old, совсем другой вопрос.)
Под капотом я разберусь. Сделал класс
Код
C++ (Qt)
struct rgbF {
friend rgbF operator + ( const rgbF & c, const rgbF & c );
 
float r, g, b;
};
 
И еще определил оператор
Код
C++ (Qt)
rgbF operator * ( const Color & c, float t );
Теперь все выражение интерполяции (c1 * (1 - weight) + с2 * weight) проходит, но рез-т rgbF, а вернуть я должен Color. Как это сделать? (про темплейт код не забывайте  :))


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 05, 2015, 16:52
Под капотом я разберусь.
Не похоже. Ваш вопрос как раз от туда. :)
Вам нужно уметь скалить значения флотов в пространство uchar.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 17:16
Цитировать
Вам нужно уметь скалить значения флотов в пространство uchar.
Не, не, я, кажется, начинаю прозревать  :)


Цитировать
Теперь все выражение интерполяции (c1 * (1 - weight) + с2 * weight) проходит, но рез-т rgbF, а вернуть я должен Color. Как это сделать?
Т.е. сейчас есть, например, такая шаблонная функция:

Код
C++ (Qt)
template <class R, class T>
R some_color_function(T clr1, T clr2);
 
 

Если она принимает и возвращает rgbF то всё ok? А если принимает Color, то не ok?
А надо чтоб по всякому работало, так?


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 05, 2015, 17:24
m_ax, я еше раз просмотрел тему... и совсем перестал понимать, в чем проблема. :)
Может Igors обеспечить интригу в своих темах... подождем, думаю новые подробности нас удивят. :)


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 17:32
Цитировать
Может Igors обеспечить интригу в своих темах... подождем, думаю новые подробности нас удивят.  :)
Угу) Товарищ igors - это как генератор случайных чисел - надо статистику набрать)


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 05, 2015, 18:45
Если она принимает и возвращает rgbF то всё ok? А если принимает Color, то не ok?
А надо чтоб по всякому работало, так?
Ну да. Есть выражение аргументы которого (c1 и c2)  template типы
Код
C++ (Qt)
return c1 * (1 - weight) + с2 * weight;
Один из типов - допотопный Color. Просто создать для него операторы не выходит - при вычислениях потеряется точность, да и вообще в каких-то случаях возможен weight > 1. Поэтому "внутри выражения" надо использовать др класс, флотовый. Шо неясно?

Угу) Товарищ igors - это как генератор случайных чисел - надо статистику набрать)
Если руки свисают ниже колен - значит "короткие ноги" (а не "длинные руки"  :))


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 05, 2015, 18:54
Ну все один к одному. :)

Шо неясно?
Перечитайте ваш вопрос, да и весь тред, там про эти чудеса где нибудь написано? :)

Специализируйте эту функцию для Color, и в ней меняйте тип на нужный, а после вычисления переводите результат в Color.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 19:27
Цитировать
Специализируйте эту функцию для Color, и в ней меняйте тип на нужный, а после вычисления переводите результат в Color.
Да, именно)

Во всех функциях нужно использовать rgbF, а результат переводить по обстоятельству)

Я бы написал свой color_cast со всеми возможными специализациями (туда и обратно):
Код
C++ (Qt)
template <class R, class T>
R color_cast(T);
 
template <>
Color color_cast<Color, rgbF>(rgbF clr)
{
   return  /* перегоняем rgbF в Color */;
}
 
template <>
rgbF color_cast<rgbF, Color>(Color clr)
{
   return /* перегоняем Color в rgbF */;
}
 
template <>
Color color_cast<Color, Color>(Color clr)
{
   return  clr;
}
 
template <>
rgbF color_cast<rgbF, rgbF>(rgbF clr)
{
   return  clr;
}
 
 

Ну и дальше во всех шаблонных функциях:
Код
C++ (Qt)
template <class R, class T>
R some_color_function(T clr1, T clr2)
{
   rgbF c1 = color_cast<rgbF>(clr1);
   rgbF c2 = color_cast<rgbF>(clr2);
   ...
   return color_cast<R>(....);
}
 

Как то так)


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 19:40
Но боюсь, что сейчас выяснятся внезапные проблемы перегона из rgbF в Color и обратно  :)


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 05, 2015, 19:56
Но боюсь, что сейчас выяснятся внезапные проблемы перегона из rgbF в Color и обратно  :)
Вы мелко думаете, скорее всего, это все не годится. :)


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 05, 2015, 21:06
Цитировать
Вы мелко думаете, скорее всего, это все не годится.  :)
Эх.. Боюсь сегодня мы этого уже не узнаем(


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 06, 2015, 08:27
Во всех функциях нужно использовать rgbF, а результат переводить по обстоятельству)

Я бы написал свой color_cast со всеми возможными специализациями (туда и обратно):
А как этот color_cast я вставлю в темплейт код? Есть выражение
Код
C++ (Qt)
return c1 * (1 - w) + c2 * w;
Что делать если с1 и с2 имеют тип Color? Очевидно нужно соскочить на вычисления в флотах. Поэтому пришлось создать свой класс rgbF и определить операторы
Код
C++ (Qt)
rgbF operator + ( const rgbF & c, const rgbF & c );
rgbF operator * ( const Color & c, float t );
Так все хорошо, но + возвращает rgbF, а в темплейт коде нужно вернуть Color (тип аргументов c1 и с2). Поэтому еще
Код
C++ (Qt)
rgbF::operator Color( void );
Вопросы

1) Правильно ли я сделал или есть др, более элегантный способ?

2) Что делать если уже имеется библиотечный класс RgbLibF у которого rgb во флотах и операторы все есть - но вот про Color он ничего не знает. Как тогда? Оператор * можно сделать так же, но как заставить вернуть Color? (трогать хедер RgbLibF нельзя)

Спасибо

Edit: можно было просто
Код
C++ (Qt)
Color operator + ( const rgbF & c, const rgbF & c );
(только сейчас заметил). Но этот случай не общий


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 08:38
Код
C++ (Qt)
template <class R, class T>
R some_color_function(T clr1, T clr2, float w)
{
   rgbLibF c1 = color_cast<rgbLibF>(clr1);
   rgbLibF c2 = color_cast<rgbLibF>(clr2);
   rgbLibF result = c1 * (1 - w) + c2 * w;         // Все вычисления выполняются с rgbLibF
   return color_cast<R>( result );                   // Кастуем в нужный тип, например это будет Color.
}
 
И описать функции каста из Color в rgbLibF и обратно.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 06, 2015, 12:33
Цитировать
А как этот color_cast я вставлю в темплейт код? Есть выражение
Легко.. Как, показано выше (пост #20).


Цитировать
Что делать если с1 и с2 имеют тип Color? Очевидно нужно соскочить на вычисления в флотах. Поэтому пришлось создать свой класс rgbF и определить операторы
Не нужно никаких своих операторов. Все операции внутри ваших шаблонных функциях производятся с rgbLibF.. А дальше кастуется в зависимости от параметра шаблона (R)..

Цитировать
1) Правильно ли я сделал или есть др, более элегантный способ?
 
С color_cast решение более элегантное, т.к. не нужно переписывать кучу непонятных операторов..

Цитировать
2) Что делать если уже имеется библиотечный класс RgbLibF у которого rgb во флотах и операторы все есть - но вот про Color он ничего не знает. Как тогда? Оператор * можно сделать так же, но как заставить вернуть Color? (трогать хедер RgbLibF нельзя)
Опять же, color_cast решает это)



Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 06, 2015, 13:42
Опять же, color_cast решает это)
Есть выражение
Код
C++ (Qt)
return c1 * (1 - w) + c2 * w;
Где здесь color_cast? Может Вы предлагаете заменить его с использованием color_cast? Каким образом и что тогда будет если c1 и c2 инстанциированы др типами (напр float)?


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 13:46
Хотелось бы еще раз напомнить про специализацию шаблонов.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 06, 2015, 14:29
Цитировать
Где здесь color_cast? Может Вы предлагаете заменить его с использованием color_cast? Каким образом и что тогда будет если c1 и c2 инстанциированы др типами (напр float)?
Похоже Вы ни меня, ни Old а не слушаете..(

Специализируете функцию color_cast:

Код
C++ (Qt)
template <class R, class T>
R color_cast(T);
 
template <>
Color color_cast<Color, Color>(Color clr) // Принимает и возвращает Color
{
   return  clr;
}
 
template <>
rgbF color_cast<rgbF, rgbF>(rgbF clr) // Принимает и возвращает rgbF
{
   return  clr;
}
 
template <>
rgbF color_cast<rgbF, float>(float clr) // кастуем float в rgbF
{
   return /*  */;
}
 
template <>
Color color_cast<Color, float>(float clr) // кастуем float в Color
{
   return /*  */;
}
 
template <>
Color color_cast<Color, rgbF>(rgbF clr) // Кастует rgbF в Color
{
   return  /* перегоняем rgbF в Color */;
}
 
template <>
rgbF color_cast<rgbF, Color>(Color clr)
{
   return /* перегоняем Color в rgbF */;
}
 

Всё. Теперь во всех функциях работаем с rgbF..

Код
C++ (Qt)
template <class R, class T>
R some_color_function(T clr1, T clr2, float w)
{
   rgbLibF c1 = color_cast<rgbLibF>(clr1);
   rgbLibF c2 = color_cast<rgbLibF>(clr2);
   rgbLibF result = c1 * (1 - w) + c2 * w;         // Все вычисления выполняются с rgbLibF
   return color_cast<R>( result );                   // Кастуем в нужный тип, например это будет Color.
}
 

Что тут непонятного то?


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 06, 2015, 14:41
Код
C++ (Qt)
template <class R, class T>
R some_color_function(T clr1, T clr2, float w)
{
   rgbLibF c1 = color_cast<rgbLibF>(clr1);
   rgbLibF c2 = color_cast<rgbLibF>(clr2);
   rgbLibF result = c1 * (1 - w) + c2 * w;         // Все вычисления выполняются с rgbLibF
   return color_cast<R>( result );                   // Кастуем в нужный тип, например это будет Color.
}
 
Что тут непонятного то?
Т.е. Вы предлагаете заменить исходную строку
Код
C++ (Qt)
return c1 * (1 - w) + c2 * w;
На
Код
C++ (Qt)
return some_color_function(c1, c2, w);
Верно? Тогда не проще ли так
Код
C++ (Qt)
template <class T>
T DoCalc( const T & c1, const T & c2, float w )
{
return c1 * (1 - w) + c2 * w;
}  
 
template <>
Color DoCalc( const Color & c1, const Color & c2, float w )
{
  rgbLibF c1 = Color2rgbLibF(clr1);
  rgbLibF c2 = Color2rgbLibF((clr2);
  rgbLibF result = c1 * (1 - w) + c2 * w;         // Все вычисления выполняются с rgbLibF
  return rgbLibF2Color(result);  
}
Но в любом случае меня смущает привязка к конкретному (и одному) выражению. Как-то негибко, а вдруг завтра придется интерполировать напр так
Код
C++ (Qt)
return (c1 * w1 + c2 * w2) / (w1 + w2);
И опять придется "оборачивать" :'( Поэтому мне кажется с операторами правильнее

Edit: "проще" я имел ввиду не надо никакого интенсивного каста - просто 2 ф-ции для перегонки из Color в rgbLibF и обратно - их по-любому писать


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 14:44
Тогда не проще ли так
Бинго. :)
И всего-то понадобилось два напоминания. :)

А еще лучше, наверное, определить один класс для работы с цветом float, с которым и производить все вычисления и добавить возможность простого преобразования из него в разные структуры типа Color (через операторы приведения типа и конструкторы).


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 06, 2015, 15:24
Цитировать
Верно? Тогда не проще ли так
Не совсем..

Ещё раз. Мы пишем один раз все специализации color_cast. Написали: теперь мы можем делать, например, так:
Код
C++ (Qt)
Color clr = color_cast<Color>(123.f);
Color clr2 = color_cast<Color>(rgbF());
rgbF clr3 = color_cast<rgbF>(Color());
 
и т.д.
 

Теперь пишем шаблонные функции для работы с цветом, например:
Код
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 );  
}
 
template <class R, class T>
R other_combine_color(T c1, T c 2, float w1, float w2)
{
   rgbLibF c1 = color_cast<rgbLibF>(clr1);
   rgbLibF c2 = color_cast<rgbLibF>(clr2);
   return color_cast<R>( (c1 * w1 + c2 * w2) / (w1 + w2) );  
}
 
и т.д..
 

Во всех пользовательских функциях мы работаем с rgbLibF, поскольку для него все эти операции уже заточены..
Для пользовательских шаблонных функций таким образом не нужно писать перегрузки или специализации.
Всё это на себя берёт специализации color_cast, который уже знает что и как во что кастить.



Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 15:31
Я так понял, что нельзя просто преобразовать float в цвет, вычислить выражение, преобразовать обратно и получить верный результат.
Поэтому, можно написать общую функцию для большинства типов, а для "плохих" типов написать специальные реализации.
Но, мне кажется один полноценный класс цвета с поддержкой всех операторов и правильных вычислений решит эти проблемы.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 06, 2015, 15:40
Цитировать
Но, мне кажется один полноценный класс цвета с поддержкой всех операторов и правильных вычислений решит эти проблемы.

А разве rgbLibF - это не тот самый класс, который всё правильно делает?) 


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 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 формулы".  Нет, все-таки правильно обеспечить операторы арифметики


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 15:43
А разве rgbLibF - это не тот самый класс, который всё правильно делает?) 
Тогда его и нужно использовать везде везде везде, а по мере надобности кастовать в разные Color.


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 06, 2015, 15:44
А разве rgbLibF - это не тот самый класс, который всё правильно делает?)  
Да, но он ничего не знает о старом Color. И rgbLibF библтотечный, хедер нельзя менять


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 15:47
А разве rgbLibF - это не тот самый класс, который всё правильно делает?)  
Да, но он ничего не знает о старом Color. И rgbLibF библтотечный, хедер нельзя менять
Поэтому, нужно сделать свой класс MyColor, возможно он будет наследник rgbLibF, плюс операторы для приведения из MyColor в rgbLibF, Color, QColor, TheBestColor и все остальные колоры.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 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  :)


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 15:56
Но я, кажется, уже опять начинаю не понимать, что же в конечном счёте хотел igors  :)
Так в этом вся прелесть. Поэтому, мне и нравиться играть с ним в его вопросы. :)
Это как разговоры с доисторическим человеком: он пытается жестами объяснить, что ему нужно, а тебе его понять за меньшее количество шагов и наводящих вопросов. :)


Название: Re: Операторы для C структуры
Отправлено: Bepec от Сентябрь 06, 2015, 16:01
Рассеянное внимание, переключение с темы на тему, игнорирование ответов и это всё в одном флаконе :D


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 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 - ведь это все арифметические выражения


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 06, 2015, 17:03
Нет, пока она у меня только одна  :) - но все-таки тут уместно вспомнить об общности. Что ж Вы рисуете combine_color, потом other_combine_color - ведь это все арифметические выражения
Так используйте правильный класс для цвета, который можно использовать в этих арифметических выражениях, у которого есть все необходимые операторы. А так же возможность приведения во все простые типы, типа Color.

А то туда и строки можно начать сувать и сокрушаться, что считается не очень правильно.


Название: Re: Операторы для C структуры
Отправлено: m_ax от Сентябрь 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.
Да, или так)

 


Название: Re: Операторы для C структуры
Отправлено: Igors от Сентябрь 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 - опять нужно членство. Вот о чем я спрашивал, а Вы какой-то, мягко говоря, "невнимательный"  :'(


Название: Re: Операторы для C структуры
Отправлено: Old от Сентябрь 07, 2015, 07:35
 Это вы правильно подметили. Во всем виноват m_ax, точнее его "невнимательность".  ;D  ;D  ;D