LINUX.ORG.RU

Карринг в C++ возможен?


0

0

Есть проблема. Хочу объявить внутри функции объект, который фактически функция одной переменной — результат подстановки n-1 аргумента у некоторой известной функции от n аргументов. Это возможно?

boost.function

boost.bind

стандартные bind1st bind2nd умеют работать только с унарными/бинарными функциями, и могут быть использованы только inplace. впрочем, при известном желании можно написать велосипед

jtootf ★★★★★
()

Карринг в бусте есть. Да и вообще в вебе кучи реализаций были.
Только лично моё мнение - в 95% случаев карринг является сигналом на то что ты что-то набыдлокодил.

tia
()
Ответ на: комментарий от tia

> Только лично моё мнение - в 95% случаев карринг является сигналом на то что ты что-то набыдлокодил.

А я не спорю, просто занимаюсь предельной оптимизацией. Грубо говоря, моя функция n-переменных на самом деле метод для доступа к элементам n-мерного массива. Мне нужно его сечение по одной переменной, когда остальные индексы фиксированы. Сейчас я копирую данные во временный одномерный массив и там использую, благо элементов всего несколько десятков, но проще было бы иметь «вектор» — функцию одной целочисленной переменной. Да, локальность данных имеется — все элементы расопложены в непрерывной области памяти (я за этим следил).

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

Поигрался с bind, пока ничего не вышло, увы.

Код-то покажи.

Begemoth ★★★★★
()
Ответ на: комментарий от annoynimous

Получилось! Но тормоза стали феерическими! Вот старый код:

// Conventional code: Using local storage
        if(type==1)  // Select proper source (storage)
          for(i=1; i<=Nz_max; i++) 
             jjj_local_storage(i) = jjj_int_storage_m1(i,g+1,r,n+1,r_prime,n_prime+1);
        else
          for(i=1; i<=Nz_max; i++)
             jjj_local_storage(i) = jjj_int_storage_m2(i,g+1,r,n+1,r_prime,n_prime+1);

А вот новый:

// Modern code: using currying procedure.
        boost::function<double (unsigned int i)> jjj_local_storage; 
        if(type==1)  // Select proper source (storage) 
             jjj_local_storage =boost::bind(&farray<double>::operator(), &jjj_int_storage_m1, _1, g+1, r, n+1, r_prime, n_prime+1); 
        else 
             jjj_local_storage =boost::bind(&farray<double>::operator(), &jjj_int_storage_m2, _1, g+1, r, n+1, r_prime, n_prime+1); 

Хоть тут и нет копирования, но косвенный доступ тормозит все весьма заметно. Nz_max=32

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

jjj_int — это интегралы произведения трех Бесселевых функций, собственно поэтому «jjj»

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

А типы jjj_int_storage_m1 и jjj_int_storage_m2 одинаковы? Если да, то можно сделать:

BOOST_AUTO(jjj_local_storage,
boost::bind(&farray<double>::operator(), 
              type == 1 ? &jjj_int_storage_m1 : &jjj_int_storage_m2, 
              _1, g+1, r, n+1, r_prime, n_prime+1);  
Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Да, конечно! Это просто два решения, отвечающие одному и тому же наботу параметров.

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Полная строка параметров компиляции такая:

-Wall -O2 -march=native -ffast-math -DEXACT_FORTRAN_SYNTAX -DCOS_BAS -fopenmp

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от Begemoth

О мой хвост, перл читабельнее

чем кресты с шаблонами. Когда уже люди начнут использовать вменяемые ЯП?

wfrr ★★☆
()
Ответ на: комментарий от Begemoth

чем меньше в языке синтаксических конструкций тем он читабельнее, лисп тут вне конкуренции, как вырожденный случай.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

чем меньше в языке синтаксических конструкций тем он читабельнее, лисп тут вне конкуренции, как вырожденный случай.

Подменяешь понятия. Важно не только читаемость языка (т.е. легкость преобразования текста на нём в АСД), но и читаемость программы, а она зависит от средств абстракции, поддерживаемых языком (и тут языки ассемблера, с их чуть более сложным синтаксисом чем у лиспа, никакую конкуренцию составить не могут).

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

а она зависит от средств абстракции, поддерживаемых языком (и тут языки ассемблера, с их чуть более сложным синтаксисом чем у лиспа, никакую конкуренцию составить не могут)

Но зато кресты тут впереди планеты всей, правда они не одиноки, к ним еще можно добавить богатенький на средства абстракции перл и прозреваю (тоже не особо бедный) сишарп (последний емнип сильно раздут от синтаксического сахара)

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> чем меньше в языке синтаксических конструкций тем он читабельнее, лисп тут вне конкуренции, как вырожденный случай.

Forth, пожалуй, вырожденнее =)

korvin_ ★★★★★
()
Ответ на: комментарий от kovrik

Вам с белкой надо на брейнфаке писать. Или лучше на whitespace - он не только «прост», но и визуально не загромождён.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Я ждал когда в треде проявятся зайчатки маразума,

ибо лишь они могут доонанироваться до предложения в качестве идеала языка не имеющего именованных сущностей.

wfrr ★★☆
()
Ответ на: комментарий от annoynimous

Пробовать не стал: другие дела нашлись.

annoynimous ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.