Boost logo

Boost Users :

From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2007-03-29 14:48:19


Chris Weed wrote:
> On 3/28/07, Tobias Schwinger <tschwinger_at_[hidden]> 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


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net