List Info

Thread: Re: Declaring overloads (and template functions).




Re: Declaring overloads (and template functions).
country flaguser name
Sweden
2007-07-26 14:39:59
Rene Rivera wrote:
> Roman Yakovenko wrote:
>> On 7/26/07, Rene Rivera <grafikrobotgmail.com> wrote:
>>> ===C++
>>> class_<A>()
>>>      .def("f",
overload<void(int)>(&A::f))
>>> ===
>>>
>>> Though, I'm not sure if one can make such an
"overload<>()" function
>>> smart enough to automatically turn the bare
function type into the
>>> corresponding member function pointer type.
>> I could be wrong but you can check this with
boost::function library.
>> http://boost.org/doc/html/function/tutorial.html#id118
6900 .
>> If that library can do this, than you can do it
too.
> 
> That is equivalent to using is_member_function_pointer

> <http:/
/boost.org/doc/html/boost_typetraits/reference.html#boost_ty
petraits.is_member_function_pointer>. 
> The problems with those is that we don't have a member
function pointer 
> yet. To be clear the function might be declared as:
> 
> template <typename FunctionType, typename
FunctionPointerType>
> FunctionPointerType overload( FunctionPointerType p )
> {
>      return p;
> }
> 
> The hard part is in calculating the FunctionPointerType
such that 
> FunctionType doesn't have include the "A:"
member pointer 
> qualification. I personally dont't see a way of doing
it :-(

Here's a prototype:

  template <class T>
  struct types
  {};

  template <class R, class T>
  struct types<R(T)>
  {
      typedef R result;
      typedef T a0;
      typedef int arity1;
  };

  template <class R, class T, class U>
  struct types<R(T,U)>
  {
      typedef R result;
      typedef T a0;
      typedef U a1;
      typedef int arity2;
  };

  template <class T, class C>
  void overload(typename types<T>::result (C:)(typename
types<T>::a0),
    typename types<T>::arity1 = 0);

  template <class T, class C>
  void overload(typename types<T>::result (C:)(typename
types<T>::a0,
    typename types<T>::a1), typename
types<T>::arity2 = 0);

  struct A
  {
      void f(int);
      char f(float,int);
  };

  int main()
  {
      overload<char(float,int)>(&A::f);
  }

HTH,
-- 
Daniel Wallin
Boost Consulting
www.boost-consulting.com


------------------------------------------------------------
-------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and
a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Boost-langbinding mailing list
Boost-langbindinglists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/boost
-langbinding

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )