Somewhere in the E.U., le 12/05/2003

   Bonjour

      I believe, and hope, I got something wrong.

      Updating the special functions library (alongside coding for 
prospective new members thereof), I hit a problem, which I can't solve 
in a satisfactory manner. It boils down to the following situation:

<CODE>

#include <complex>
#include <iostream>
#include <valarray>


// (1) Plain vanilla templated function

template<typename T>
T              f(T x)
{
   ::std::cout << "Plain vanilla templated function" << ::std::endl;
   
   return(x);
}


// (2) Template-template function

template<typename T, template<typename> class U>
U<T>           f(U<T> x)
{
   ::std::cout << "Template-template function" << ::std::endl;
   
   return(x);
}


// (3) Valarray function

template<typename T>
::std::valarray<T>   f(const ::std::valarray<T> & x)
{
   ::std::cout << "Valarray function" << ::std::endl;
   
   ::std::valarray<T>   result = x;
   
   return(result);
}



int main()
{
   double                     x(1);
   
   f(x);
   
   ::std::complex<double>        y(0,1);
   
   f(y);
   
   const ::std::valarray<double> z(3);
   
   f(z);
}

</CODE>

      Let us say that f is sinc. In the current library, I have forms 
(1), for the usual floating point types, and (2), for complex, 
quaternion and octonions. I wanted to add (3) for valarrays of floating 
point types (and later, yet another form for valarrays of complex et 
al), along what exists for, say, sin.

      This turns out to be impossible, at least according to my 
compiler, which complains about an ambiguity in overload resolution 
between (2) and (3) (if I comment out (2) or (3) it all compiles, with 
naturally wrong behaviour...). Explicit instantiation (those I have 
tried, at least...) does not help.

      I understand that (1) and (2) are unordered (neither is more 
specialized than the other). It is also clear that (3) is more 
specialized than (1). It is less clear to me that (3) should also be 
more specialized than (2).

      One possible, partial, remedie I have in mind would be to remove 
(2), add corresponding specializations in the headers for quaternions 
and octonions, and add specialization for complex and valarray in sinc's 
header (can't modify <complex> or <valarray> as they are standard). But 
this is most inelegant, as the code for three specializations is exactly 
the same, except for types, and this is precisely the reason for using 
(2)! Furthermore, if we want to add new functions that may work on 
complex, quaternions and octonions, we would have to modify their 
headers for each and every one. That's an appaling lack of 
orthogonality! Another approach would be to leave the headers for 
quaternions and octonions alone, and stuff sinc's header with lots of 
specilizations, most of which really are instanciations of (2), and 
that's both inelegant and a possible maintenance problem.

      I welcome any suggestion on that matter (and would most welcome 
somebody showing me what I got wrong :-)   ).

   Merci

         Hubert Holin

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to