![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Доброго времени суток...
Возникла небольшая проблема с дизайном типа данных для функции, принимающей вектор. имеется:
Соотвественно вопрос - можно ли как-нибудь переопределить тип multivariate_function_t, или сделать еще что-нибудь, чтобы избежать копирования данных из строки матрицы в вектор? Заранее спасибо... -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
почему бы в твою multivariate_function_t не передать ссылку на твой matrix_row ?
Добавлено через 6 минут и 13 секунд кто такой matrix_row ? |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Он из boost::numeric::ublas - шаблон, позволяющий получить доступ к строке матрицы.
Потому что уже есть функции, принимающие ссылку на std::vector и работающие с ним. Чтобы был понятнее зачем это надо - в данный момент реализую алгоритм глобальной оптимизации, соответственно оптимизатор должен принимать на входе функцию, которую оптимизирует... -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
В идеале хотелось бы, чтобы функция принимала некий обобщенный вектор, который был бы совместим и с std::vector и с matrix_row... Может в boost есть какой-нибудь враппер для stl-совместимых коллекций и можно было бы использовать его?
-------------------- ![]() |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ох и слеп я, слеп %) да, ты можешь переопределить тип multivariate_function_t при помощи overloaded_function, и тогда multivariate_function_t сможет вызывать перегруженные функции принимающие вектор и matrix_row. я все правильно понял? Добавлено @ 17:18 т.е. в итоге получится что-то типа:
Добавлено @ 17:19
это вряд ли... не могу найти доку по matrix_row. дай плиз ссылку ;) Это сообщение отредактировал(а) boostcoder - 31.7.2012, 17:20 |
||||||
|
|||||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Кажется я уже ближе к решению проблемы, только вот остается проблема работы оптимизатора со старыми функциями, принимающими вектор... Хотелось бы иметь некий абстрактный враппер для stl-совместимых коллекций, но видимо о многом мечтаю...
На крайний случай можно использовать vector<vector<double>> вместо матрицы... ) -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
kosmonaFFFt, повторюсь: ты лечишь последствия. последствия кривого дизайна.
но решать тебе, конечно. |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
После Java довольно трудно делать хороший дизайн на C++... Пока еще не очень поздно, хотелось бы данный пункт дизайна вылечить как-нибудь...
boostcoder, интересно твое мнение следующего решения: переопределить vector_t так, чтобы он мог без сильных накладных расходов враппить (например с помощью специализации шаблона и неявного приведения типов) другие коллекции, предоставляя к ним единый интерфейс... -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а может проще функцию _eval_fn_values сделать шаблонной принимающей произвольный тип? тогда ее можно будет специализировать по множеству критериев. |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Немного не то... Идет оптимизация функции, принимающей вектор, а _eval_fn_values ее просто вызывает внутри себя... Вот если бы оптимизируемая функция могла принимать какую-то одну обобщенную обертку вида vector_wrapper<double>, для которой, при необходимости, можно было бы написать специализации для разных коллекций, это было бы то... Тогда бы все функции принимали эту обертку, а при компиляции подсовывалась бы нужная специализация... Такое вообще возможно?
-------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это возможно. а в чем тут разница между "функция могла принимать какую-то одну обобщенную обертку", и "при компиляции подсовывалась бы нужная специализация" ? С++ - компилируемый ЯП. я все же наверное не очень понимаю задачу... попробуй на пальцах ;) |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Хотелось бы как-то так (нерабочий пример):
и чтобы при этом можно было бы неявно преобразовывать vector<int> в collection_wrapper<int, vector<int> >. -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
мы можем специализировать как для хранимого типа, так и для некоторых условий и констант, обязав себя соблюсти интерфейс. к примеру:
|
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
А можно ли добиться, чтобы передаваемый в функцию враппер параметризовался только одним аргументом - типом хранящегося в коллекции значения?
-------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |