Boost.Function также является разумным выбором здесь (обратите внимание, что я не тестировал то, что написал ниже, так что это может потребовать некоторой модификации - в частности, я не уверен, что вам нужно вызывать какую-то () для вашего объекта CComPtr):
#include <atlbase.h>
#include <boost/function.hpp>
#include <boost/bind.hpp>
void update( boost::function<HRESULT (UINT*)> com_uint_getter, UINT& u )
{
UINT tmp;
if ( S_OK == com_uint_getter( &tmp ) ) {
u = tmp;
}
}
// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
// I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
CComPtr< IDispatch > ptr;
UINT u;
update( boost::bind(&IDispatch::GetTypeInfoCount, ptr), u );
return 0;
}
Это то же самое, что и все элементы указателя на член, о которых упоминал morechilli, но оно скрывает некоторый беспорядочный синтаксис его использования.