Boost logo

Boost Users :

Subject: Re: [Boost-users] enable_if for class members
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2009-01-30 12:37:33


AMDG

Christopher Jefferson wrote:
> In a class, I want to have one member function which has different
> implementations depending on one of the template parameters. I tried
> to use enable_if
>
> template<bool b>
> struct foo
> {
> typename boost::enable_if_c<b, int>::type
> get_val( )
> { return 2; }
>
> typename boost::disable_if_c<b, int>::type
> get_val()
> { return 3; }
> };
>
> But when I use foo in code, it doesn't work, complaning that:
> error: no type named 'type' in 'struct boost::enable_if_c<true, int>'

enable_if doesn't work for members of a template class unless those members
are themselves templates.

> Am I not using enable_if in the correct way? Is there any easy way to
> do waht I'm trying to do? I used to do this by declaring an inner
> class and overloading that, but then it is necessary to pass in the
> class and the code looks very messy.

You could use private member functions

template<bool b>
struct foo
{
public:
    int get_val() { return(get_val(boost::mpl::bool_<b>())); }
private:
    int get_val(boost::mpl::true_) { return(2); }
    int get_val(boost::mpl::false_) { return(3); }
};

In Christ,
Steven Watanabe


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