И использовать её в другом 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");
}
Все примеры игрушечные, но есть код, в котором это нужно.