Chris Weed wrote:
On 3/28/07, Tobias Schwinger <tschwinger@isonews2.com> wrote:
Christian Henning wrote:
Hi there, I'm trying to find a solution for looking for type vector containing a specific type. On another thread I was suggested to use at_c within the find_if algorithm. Unfortunately the code doesn't compile. Placeholder substitution won't work in templates taking non-type arguments, such as at_c.
typedef mpl::find_if<mat, is_same<mpl::at_c<mpl::_1,1>, int> >::type iter; Try using 'at' and 'int_':
typedef find_if<mat, is_same<at<_1,int_<1> >, int> >::type iter;
Regards, Tobias
I am curious why at_c doesn't do the same thing. Shouldn't these be equivalent.
Yes, ideally. But it would be rather heavy, implementation-wise. You can decompose a type created by specializing a template like this: template<typename T> struct template_traits; template<template <typename> class Tpl, typename T0> struct template_traits< Tpl<T0> > { static const int arity = 1; typedef T0 first_type; }; template<template<typename,typename> class Tpl, typename T0, typename T1> struct template_traits< Tpl<T0,T1> > { static const int arity = 2; typedef T0 first_type; typedef T1 second_type; }; //... That's roughly what the MPL lambda facility does. Now imagine you want to support int typed (non-type) template parameters. Right, we'd need all combinations - N^2 specializations - only for ints. Also note that several compilers won't handle the code above, so MPL needs to emulate it. Regards, Tobias