| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > шаблон функции от вектора |
| Автор: kosmonaFFFt 31.7.2012, 16:34 | ||
| Доброго времени суток... Возникла небольшая проблема с дизайном типа данных для функции, принимающей вектор. имеется:
Соотвественно вопрос - можно ли как-нибудь переопределить тип multivariate_function_t, или сделать еще что-нибудь, чтобы избежать копирования данных из строки матрицы в вектор? Заранее спасибо... |
| Автор: boostcoder 31.7.2012, 16:54 |
| почему бы в твою multivariate_function_t не передать ссылку на твой matrix_row ? Добавлено через 6 минут и 13 секунд кто такой matrix_row ? |
| Автор: boostcoder 31.7.2012, 17:08 | ||
ну так ты сейчас лечишь последствия. меняй реализацию так, чтоб multivariate_function_t принимала ссылку на matrix_row. или что? |
| Автор: kosmonaFFFt 31.7.2012, 17:13 |
| В идеале хотелось бы, чтобы функция принимала некий обобщенный вектор, который был бы совместим и с std::vector и с matrix_row... Может в boost есть какой-нибудь враппер для stl-совместимых коллекций и можно было бы использовать его? |
| Автор: boostcoder 31.7.2012, 17:14 | ||||||
ох и слеп я, слеп %) да, ты можешь переопределить тип multivariate_function_t при помощи http://www.boost.org/doc/libs/1_50_0/libs/functional/overloaded_function/doc/html/index.html, и тогда multivariate_function_t сможет вызывать перегруженные функции принимающие вектор и matrix_row. я все правильно понял? Добавлено @ 17:18 т.е. в итоге получится что-то типа:
Добавлено @ 17:19
это вряд ли... не могу найти доку по matrix_row. дай плиз ссылку ;) |
| Автор: kosmonaFFFt 31.7.2012, 17:27 |
| Кажется я уже ближе к решению проблемы, только вот остается проблема работы оптимизатора со старыми функциями, принимающими вектор... Хотелось бы иметь некий абстрактный враппер для stl-совместимых коллекций, но видимо о многом мечтаю... На крайний случай можно использовать vector<vector<double>> вместо матрицы... ) |
| Автор: boostcoder 31.7.2012, 17:32 |
| kosmonaFFFt, повторюсь: ты лечишь последствия. последствия кривого дизайна. но решать тебе, конечно. |
| Автор: kosmonaFFFt 31.7.2012, 17:42 |
| После Java довольно трудно делать хороший дизайн на C++... Пока еще не очень поздно, хотелось бы данный пункт дизайна вылечить как-нибудь... boostcoder, интересно твое мнение следующего решения: переопределить vector_t так, чтобы он мог без сильных накладных расходов враппить (например с помощью специализации шаблона и неявного приведения типов) другие коллекции, предоставляя к ним единый интерфейс... |
| Автор: boostcoder 31.7.2012, 18:19 |
а может проще функцию _eval_fn_values сделать шаблонной принимающей произвольный тип? тогда ее можно будет специализировать по множеству критериев. |
| Автор: kosmonaFFFt 31.7.2012, 18:58 |
| Немного не то... Идет оптимизация функции, принимающей вектор, а _eval_fn_values ее просто вызывает внутри себя... Вот если бы оптимизируемая функция могла принимать какую-то одну обобщенную обертку вида vector_wrapper<double>, для которой, при необходимости, можно было бы написать специализации для разных коллекций, это было бы то... Тогда бы все функции принимали эту обертку, а при компиляции подсовывалась бы нужная специализация... Такое вообще возможно? |
| Автор: boostcoder 31.7.2012, 19:03 | ||
это возможно. а в чем тут разница между "функция могла принимать какую-то одну обобщенную обертку", и "при компиляции подсовывалась бы нужная специализация" ? С++ - компилируемый ЯП. я все же наверное не очень понимаю задачу... попробуй на пальцах ;) |
| Автор: kosmonaFFFt 31.7.2012, 19:08 | ||
Хотелось бы как-то так (нерабочий пример):
и чтобы при этом можно было бы неявно преобразовывать vector<int> в collection_wrapper<int, vector<int> >. |
| Автор: boostcoder 31.7.2012, 19:09 | ||
мы можем специализировать как для хранимого типа, так и для некоторых условий и констант, обязав себя соблюсти интерфейс. к примеру:
|
| Автор: kosmonaFFFt 31.7.2012, 19:21 |
| А можно ли добиться, чтобы передаваемый в функцию враппер параметризовался только одним аргументом - типом хранящегося в коллекции значения? |
| Автор: boostcoder 31.7.2012, 19:24 |
так-то можно. но я все равно не понимаю, зачем.. |
| Автор: kosmonaFFFt 31.7.2012, 19:32 | ||
Чтобы было:
|
| Автор: boostcoder 31.7.2012, 19:41 | ||
да. но а как тогда специализировать контейнер который представляет враппер? |
| Автор: kosmonaFFFt 31.7.2012, 19:44 | ||
А компилятор не может этого сделать по типу передаваемого аргумента? Т. е. если передаем аргумент типа vector<int>, то он кастуется в wrapper<int, vector<int>>... |
| Автор: boostcoder 31.7.2012, 19:51 | ||
- я понял в прямом смысле. т.е. double, float, long... а ты про специализированный контейнер? типа?:
? |
| Автор: kosmonaFFFt 31.7.2012, 19:58 | ||
Ага, так тоже пойдет, вроде у всех контейнеров, что я видел, есть внутри что-то наподобие
и его можно использовать в враппере... |
| Автор: boostcoder 31.7.2012, 20:23 |
| так вопрос решен? |
| Автор: kosmonaFFFt 31.7.2012, 20:26 |
| Теоретически... ) Как решу практически, закрою тему... Спасибо за помощь... З.Ы. В общем немного разобрался с параметризацией шаблонов, проблему решил, хоть и немного по другому... |
| Автор: kosmonaFFFt 10.9.2012, 18:19 | ||
| Ап... Посмотрел вот тут на std::function, и подумал, а нельзя ли сделать подобный враппер для объектов, имеющих оператор [], чтобы можно было бы написать что-то подобное следующему:
Попытался разобраться в исходниках std::function, но суть так и не понял, как именно там реализовали то, что можно создать объект std::function из всего, что имеет operator(), соответствующей сигнатуры... |