
Dean Michael Berris wrote:
The world fusion (and for that matter, mpl) lives in has some peculiar constraints. As I noted above, one is that you cannot determine a type from a runtime predicate. You can, however, do it inside-out. IOTW, let the predicate itself get the info that you need. If you really need to return a type, somehow, you can, for example, use a pointer to a base class, hold the value in a boost::any, etc. In other words use type erasure. If I were you, I'd use the visitor, f, itself to do the action as soon as the correct type is obtained. No type erasure magic.
This makes sense, though there might be a possibility where a homogeneous tuple would be able to return just a single value:
struct equals_2 { template <typename T> T operator() (T element) const { if (element == 2) return element; }; };
typedef fusion::tuple<int, int, int> point_type; point_type point(1, 2, 3); assert(fusion::is_homogenous<point_type>::value == true); assert(fusion::find_first_if<equals_2>(point) == 2); // only works if 'point' is a homogeneous container
If that was the case, I'd use boost::array which is a nice data structure that has a special property: it is *both* a fusion sequence *and* an stl sequence. Regards, -- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net