LINUX.ORG.RU

Как передать phoenix-функцию в качестуе параметра функции

 , ,


1

2

И использовать её в другом phoenix-выражении, передав в неё некие аргументы.

Этот вариант не компилируется.

#include <iostream>
#include <algorithm>

#include <boost/spirit/include/phoenix.hpp>
namespace ph = boost::phoenix;
namespace var = boost::phoenix::local_names;
namespace arg = boost::phoenix::arg_names;

template <typename T>
void foo (const T &t){
    int i = 0;
    int a[] = {1, 2, 3, 4};
    std::for_each (a, a+4, ph::bind(&t, ph::ref(i), arg::arg1));
}

int main(){
    foo (ph::ref(std::cout) << arg::arg1 << "\n");
}

Этот выводит 1 2 3 4 вместо ожидаемых нулей.

#include <iostream>
#include <algorithm>

#include <boost/spirit/include/phoenix.hpp>
namespace ph = boost::phoenix;
namespace var = boost::phoenix::local_names;
namespace arg = boost::phoenix::arg_names;

template <typename T>
void foo (const T &t){
    int i = 0;
    int a[] = {1, 2, 3, 4};
    std::for_each (a, a+4, ph::lambda[t](ph::ref(i), arg::arg1));
}

int main(){
    foo (ph::ref(std::cout) << arg::arg1 << "\n");
}

Все примеры игрушечные, но есть код, в котором это нужно.

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

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

Есть, но я на буст уже много времени убил. Хочется довести до конца.

Mihai-gr ()
Ответ на: комментарий от anonymous

во ты пишеш phoenix функцию что это за сраный птичий язык хоть бы объяснил ради чего ты это говно городиш

anonymous ()
Ответ на: комментарий от Mihai-gr

Есть, но я на буст уже много времени убил. Хочется довести до конца.

типа чемодан без ручки, выкинуть жадность давит?

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

Есть, но я на буст уже много времени убил. Хочется довести до конца.

а целесообразно ли это ? а то

«Глуп тот человек, который остается всегда неизменным.» Вольтер

ну если вы точно уверены тогда это вас ободрит

«Любое препятствие преодолевается настойчивостью.» Леонардо да Винчи

а вообще как сказал умный человек

«Не корми словами вместо хлеба.» Аристофан

не буду вам мешать я не хочу даже вникать в говномагию бустовскую

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

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

anonymous ()

Здесь ты создаешь функцию одного аргумента:

foo (ph::ref(std::cout) << arg::arg1 << "\n");

А в foo используешь как функцию двух аргументов, тебя это не смущает?

Для Phoenix-овских функциональных объектов bind не нужен:

std::for_each (a, a+4, t(ph::cref(i), arg::arg1));

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

Полный пример:

#include <iostream>
#include <algorithm>

#include <boost/phoenix.hpp>
namespace ph = boost::phoenix;
namespace var = boost::phoenix::local_names;
namespace arg = boost::phoenix::arg_names;

template <typename T>
void foo(T t)
{
    int i = 0;
    int a[] = {1, 2, 3, 4};
    std::for_each(a, a+4, t(ph::cref(i), arg::arg1));
}

int main()
{
	foo(ph::ref(std::cout) << arg::arg1 << ' '  << arg::arg2 << "\n");
	std::cin.get();
}

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

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

Уточню, значение также можно преобразовать в безаргументную функцию с помощью ph::val.

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

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

Спасибо. Вот это помогло.

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