Boost logo

Boost :

From: Maurizio Vitale (maurizio.vitale_at_[hidden])
Date: 2007-06-25 12:28:08


On Jun 25, 2007, at 11:50 AM, Peter Dimov wrote:

> Maurizio Vitale wrote:
>
>> In short, the documentation for enable_if shows that it can be used
>> for selecting a class specialization depending on a predicate. Now
>> Intel C++ refuses to do that and the frontend team at Intel believes
>> this
>> is the right thing to do (although they'll look into the issue
>> further for the sake of compatibility with GCC). Their argument is
>> that the SFINAE rule applies to the selection of the overload set for
>> functions only and not to partial specialization for classes.
>
> I think that the compiler is right to reject your code since the
> predicate
> doesn't depend on T. The S in SFINAE stands for 'substitution', and no
> substitution occurs in your predicate. The instantiation of S<B>
> can fail
> even without a reference to foo because your second declaration of
> foo is
> ill-formed.
>
>

Thanks this cleared the issue for me. The following goes through the
Intel compiler
as well. Instantiation is a bit more cumbersome (but not terrible
because in my real code
it would happen from within S), but at least is (hopefully) standard
compliant.

template<typename X>
struct S {

   template<typename T, typename XX, typename Enable=void> struct foo {
     enum { value=0 };
   };

   template<typename T, typename XX>
   struct foo<T, XX, typename enable_if<is_same<XX,A> >::type>
   {
     enum { value=1 };
   };
};


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk