LINUX.ORG.RU

C++ и currying


0

0

Подскажите, как его реализовать. Я понимаю, что каждый из возвращаемых функторов должен иметь доступ к области видимости первого. Но как это изобразить в коде на плюсах -- не вижу.

Карриинг - это то, что в с++ реализуется семейством функций bind, как я понимаю, или вы не про то?

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

что то мне говорит, что не как

а сами написать?

template<typename F, typename R, typename A>
class carrying {
 F m_f;
public:
 carrying(F f) : m_f(f) {}

 R operator()(A a)
 { return m_f(a, a); }

}

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

>bind -- это из boost-а, а мне желательно на стандартной библиотеке.

std::bind1st & std::bind2nd. Удачи - она тебе понадобится.

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

int f(char, char);

carrying< int(*)(char, char), int, char > c(&f);

c('a');

Вот так

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

я не думаю что std:bind* это то, что ему надо

как я поянл

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

> std::bind1st & std::bind2nd. Удачи - она тебе понадобится.

Их видел я! Только осталось придумать, как-же использовать всё это богатство?

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

Нужно автоматически связывать произвольное количество обработчиков с источниками. Количество параметров тоже должно быть нефиксированным. Напрямую спросить у класса, что у него в потрохах -- не представляется возможным, поэтому и хочу попробовать каррировать обработчики.

Или какой-нить левый скриптовой язык попользовать, вроде Lua?

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

Не понял

конкретизируй задачу

кто с чем? какие интерейсы и тд

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

>Нужно автоматически связывать произвольное количество обработчиков с источниками.

Можно Loki::Functor & Loki::BindFirst попробовать. У Loki есть то приемущество что можно просто засунуть часть его исходников в проект, не добавляя зависимостей. boost я так понял не используется потому что не хочется лишних зависимостей, да?

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

>>bind -- это из boost-а, а мне желательно на стандартной библиотеке.

>std::bind1st & std::bind2nd. Удачи - она тебе понадобится.

boost::bind -- это стандарт де-факто. Кроме того, в C++0x bind стал стандартом де-юре, а std::bind1st/2nd объявлены deprecated.

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

>К сожелению они росто фиксируют один аргумент или тебе это и надо?

Ну это тоже можно назвать каррированием -- по крайней мере, очень частным его случаем:)

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