Название: Операторы для C структуры Отправлено: Igors от Сентябрь 05, 2015, 13:13 Добрый день
Есть хедеры либы на С, там объявлена такая структура Код В пучине уже моих темплейт есть такое Код Конечно при попытке инстанциации T = Color это не компилится т.к. для структуры Color нет нужных операторов. Как это порешать? Спасибо Название: Re: Операторы для C структуры Отправлено: m_ax от Сентябрь 05, 2015, 13:50 Цитировать Конечно при попытке инстанциации T = Color это не компилится т.к. для структуры Color нет нужных операторов. Как это порешать? Написать перегрузку для этих операторов?)Код
Название: 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) - неверно. Тут, конечно, стоили бы сразу спросить, а как это посчитать правильно, с вашей точки зрения. Но мы развлекаемся, поэтому сразу предложу так:Код
Название: Re: Операторы для C структуры Отправлено: Igors от Сентябрь 05, 2015, 16:29 Я бы вообще не вводил арифметику для таких объектов, как color.. Дабы людей не смущать) А так и есть - но это место в template коде (см первый пост)Лучше написать набор функций с говорящими названиями, имхо) Ну мы это уже проходили.. То что там будет под капотом этих опереторов это, как уже заметил Old, совсем другой вопрос.) Под капотом я разберусь. Сделал класс Код И еще определил оператор Код Теперь все выражение интерполяции (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. Как это сделать? Т.е. сейчас есть, например, такая шаблонная функция:Код
Если она принимает и возвращает 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 типыА надо чтоб по всякому работало, так? Код
Угу) Товарищ igors - это как генератор случайных чисел - надо статистику набрать) Если руки свисают ниже колен - значит "короткие ноги" (а не "длинные руки" :))Название: Re: Операторы для C структуры Отправлено: Old от Сентябрь 05, 2015, 18:54 Ну все один к одному. :)
Шо неясно? Перечитайте ваш вопрос, да и весь тред, там про эти чудеса где нибудь написано? :)Специализируйте эту функцию для Color, и в ней меняйте тип на нужный, а после вычисления переводите результат в Color. Название: Re: Операторы для C структуры Отправлено: m_ax от Сентябрь 05, 2015, 19:27 Цитировать Специализируйте эту функцию для Color, и в ней меняйте тип на нужный, а после вычисления переводите результат в Color. Да, именно)Во всех функциях нужно использовать rgbF, а результат переводить по обстоятельству) Я бы написал свой color_cast со всеми возможными специализациями (туда и обратно): Код
Ну и дальше во всех шаблонных функциях: Код
Как то так) Название: 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 со всеми возможными специализациями (туда и обратно): Код Что делать если с1 и с2 имеют тип Color? Очевидно нужно соскочить на вычисления в флотах. Поэтому пришлось создать свой класс rgbF и определить операторы Код Так все хорошо, но + возвращает rgbF, а в темплейт коде нужно вернуть Color (тип аргументов c1 и с2). Поэтому еще Код Вопросы 1) Правильно ли я сделал или есть др, более элегантный способ? 2) Что делать если уже имеется библиотечный класс RgbLibF у которого rgb во флотах и операторы все есть - но вот про Color он ничего не знает. Как тогда? Оператор * можно сделать так же, но как заставить вернуть Color? (трогать хедер RgbLibF нельзя) Спасибо Edit: можно было просто Код (только сейчас заметил). Но этот случай не общий Название: Re: Операторы для C структуры Отправлено: Old от Сентябрь 06, 2015, 08:38 Код И описать функции каста из 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 решает это) Есть выражениеКод Где здесь 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: Код
Всё. Теперь во всех функциях работаем с rgbF.. Код
Что тут непонятного то? Название: Re: Операторы для C структуры Отправлено: Igors от Сентябрь 06, 2015, 14:41 Код Что тут непонятного то? Код На Код Верно? Тогда не проще ли так Код Но в любом случае меня смущает привязка к конкретному (и одному) выражению. Как-то негибко, а вдруг завтра придется интерполировать напр так Код И опять придется "оборачивать" :'( Поэтому мне кажется с операторами правильнее Edit: "проще" я имел ввиду не надо никакого интенсивного каста - просто 2 ф-ции для перегонки из Color в rgbLibF и обратно - их по-любому писать Название: Re: Операторы для C структуры Отправлено: Old от Сентябрь 06, 2015, 14:44 Тогда не проще ли так Бинго. :)И всего-то понадобилось два напоминания. :) А еще лучше, наверное, определить один класс для работы с цветом float, с которым и производить все вычисления и добавить возможность простого преобразования из него в разные структуры типа Color (через операторы приведения типа и конструкторы). Название: Re: Операторы для C структуры Отправлено: m_ax от Сентябрь 06, 2015, 15:24 Цитировать Верно? Тогда не проще ли так Не совсем..Ещё раз. Мы пишем один раз все специализации color_cast. Написали: теперь мы можем делать, например, так: Код
Теперь пишем шаблонные функции для работы с цветом, например: Код
Во всех пользовательских функциях мы работаем с 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, поскольку для него все эти операции уже заточены.. Идея понятна, ноТеперь пишем шаблонные функции для работы с цветом, например: Зачем тогда 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 библтотечный, хедер нельзя менятьНазвание: Re: Операторы для C структуры Отправлено: m_ax от Сентябрь 06, 2015, 15:50 Цитировать Зачем тогда R и T? Все равно внутри конкретный rgbLibF и единственный T = Color. Как зачем? Я думал нужно уметь делать так, например:Код
Цитировать Тогда его и нужно использовать везде везде везде, а по мере надобности кастовать в разные 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 Как зачем? Я думал нужно уметь делать так, например: Это я и так сделаю, без всяких template - ведь в том что Вы привели типы задаются явно.Код
Согласен) Но я, кажется, уже опять начинаю не понимать, что же в конечном счёте хотел igors Улыбающийся Это ясно сказано в первом посте: обеспечить корректное выполнение выраженияКод При условии что одним из инстанциированных типов может быть 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, который это всё умеет.. Ну так в чём проблема: Код ??? Цитировать Так используйте правильный класс для цвета, который можно использовать в этих арифметических выражениях, у которого есть все необходимые операторы. А так же возможность приведения во все простые типы, типа Color. Да, или так)Название: Re: Операторы для C структуры Отправлено: Igors от Сентябрь 07, 2015, 06:10 На что я предложил написать операторы для Color, но у Вас там возникли какие-то проблемы.. Это просто неверно, что толку считать во флотах если выход каждого оператора обрезается до uchar? Надо все выражение посчитать во флотах, а рез-т уже привести к Color. Но как мне это сделать? Напр я не могу написатьПотом, оказывается, есть rgbLibF, который это всё умеет.. Ну так в чём проблема: Код ??? Код Т.к. этот оператор должен быть членом класса. Или в rgbLibF определить оператор Color - опять нужно членство. Вот о чем я спрашивал, а Вы какой-то, мягко говоря, "невнимательный" :'( Название: Re: Операторы для C структуры Отправлено: Old от Сентябрь 07, 2015, 07:35 Это вы правильно подметили. Во всем виноват m_ax, точнее его "невнимательность". ;D ;D ;D
|