
On 7/24/10 5:31 AM, Ahmed Charles wrote:
std::bind and boost::bind are both monomorphic. phoenix::bind is polymorphic!
Would you (or anyone else) mind explaining polymorphic vs monomorphic in this context? Or point to an explanation?
When you bind a function-pointer or member-function pointer, you are passing in an exact signature with exact argument and return types (e.g. int(*)(int)). OTOH, when you bind a function-object, the bound function object may have various overloads or templates that deal with different argument and return types. However, without decltype, we can't deduce the return type from argument types. The original protocol was to require function objects to have a typedef result_type. But this forces them to be monomorphic since you can't choose the return type depending on the argument types that are actually passed. The new result_of protocol fixes this. Phoenix had polymorphic bind from day one, albeit with a different "resulf" protocol that predates "result_of". Actually, if you look at the result_of documentation, Phoenix is one of the inspirations. Phoenix3 now uses the standard result_of protocol. (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1454.html) Regards, -- Joel de Guzman http://www.boostpro.com http://spirit.sf.net