Boost logo

Boost Users :

From: Li, PingShan \(Kansas City\) (pingshan.li_at_[hidden])
Date: 2007-05-07 13:21:54


I have a question related to setting a C++ member function as a callback function for C library's API.
I searched the boost mailing list and Google, but I could not find a clear answer.

The function I need to call is OpenSSL's CRYPTO_set_id_callback function. It accepts a function
pointer as its parameter.

The following code works fine:

unsigned long IdCallBack( )
{
  return ( ( unsigned long )GetCurrentThreadId( ) );
}

CRYPTO_set_id_callback( (unsigned long (*)())IdCallBack );

I have a C++ class and I want to set the call back function to be the member function of my class, I
tried to use boost::bind:

class Test
{
public:

  Test( unsigned long a ) : m_long( a )
  {
  }

  virtual ~Test( )
  {
  }

  unsigned long GetId()
  {
    return m_long;
  }

  void SetCallBack()
  {
    CRYPTO_set_id_callback( boost::bind( &Test::GetId, this ) );
  }

private:

  unsigned long m_long;

};

I got the following error under VC++ 7.1:

error C2664: 'CRYPTO_set_id_callback' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>' to
'unsigned long (__cdecl *)(void)'
        with
        [
            R=unsigned long,
            F=boost::_mfi::mf0<unsigned long,Test>,
            L=boost::_bi::list1<boost::_bi::list_av_1<Test *>::B1>
        ]
        No user-defined-conversion operator available that can perform this conversion, or the
operator cannot be called

Is it possible to use boost::bind to bind a C++ member function as a callback function for C
interface?

Thank you


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