On Thursday 24 June 2010 09:31:36 Thomas Heller wrote:
On Wednesday 23 June 2010 18:50:38 Ovanes Markarian wrote:
Stephan, hi!
please see my answer below.
On Wed, Jun 23, 2010 at 5:42 PM, Stephan Menzel
wrote: Unless I want to add something. Unfortunately I can't always take wrap()s output but have to modify a little. In fact, my Queue needs to be templatized as well, modifying the behaviour of the functor. I have a template parameter "Calling". When it is true, another function shall be called by the functor after the method was posted. Now I wanted to do this by phoenix:
template <bool Calling> class Queue {
template<typename Handler>
void post(Handler n_handler) {
m_iosrv.post(n_handler);
};
...
template
boost::signals2::connection connect(boost::signals2::signal<SlotSignature> &n_signal, SlotFunction n_method) {
return n_signal.connect(
if_( CallingBack ) [
post(n_method) , m_signal_callback()
] .else_ [
m_iosrv.wrap( n_method )
] );
};
...
It is difficult to conclude smth from the code without having a self-containing example. But my assumption is that in the 'else'-branch your code does not generate a function object. As far as I can see in the 'if'-branch your code generates a function object using the the comma-operator (if that operator is overloaded in Phoenix), in the 'else'-branch you just have a normal function call, which is not lazy and does not return a function-object.
Phoenix statements always return void. What you want is: phoenix::if_else( CallingBack, /* then functor */, /*else functor */ )
For reference: http://www.boost.org/doc/libs/1_43_0/libs/spirit/phoenix/doc/html/phoenix/c omposite.html#phoenix.composite.operator and http://www.boost.org/doc/libs/1_43_0/libs/spirit/phoenix/doc/html/phoenix/c omposite.html#phoenix.composite.statement (There is a note at the end of that section, for the return value of phoenix statements)
Sorry misunderstood your problem ... The correct answer is: post, m_signal_callback() and m_iosrv.wrap need to be lazy expressions. To achieve that for the first two, you can have a phoenix::function wrapper, for the last one, you can use phoenix::bind (which can be used for the first two as well).