Вопрос по boost, bind, function.
Есть такая функция, которая определяет единый способ вызова некоторого набора функций (в данном случае MFC::CRecordset).
template< typename R >
R CallMfc( boost::function<R ( void )> func )
{
try
{
return CheckResult( func );
}
catch( CDBException* pEx )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Close();
TCHAR errorBuffer[ 2048 ];
pEx->GetErrorMessage( errorBuffer, 2048 );
errorMessage_ = errorBuffer;
throw XTOOStatus( e_DB_CONTROL );
}
}
template< typename R >
R CheckResult( boost::function<R ( void )> func )
{
return func();
}
И есть например такой вызов:
CallMfc<BOOL>( bind( &CRecordset::Open, recordset_, AFX_DB_USE_DEFAULT_TYPE, (LPCTSTR)0, CRecordset::none ) );
Он компилируется, но хотелось бы его сократить.
1. избавиться от <BOOL>, если не специализировать вызов, то выдается ошибка "could not deduce template argument "
Странно, почему так?
2. (не надеюсь особо, но вдруг) — избавиться от AFX_DB_USE_DEFAULT_TYPE, (LPCTSTR)0, CRecordset::none, чтоб вместо них подставлялись значения по умолчанию
BOOL Open(UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none);