У меня есть вспомогательный класс, определенный следующим образом:
DataGuard.h
template<typename T, typename D>
class DataGuard {
public:
typedef MY_STATUS( *FunctionType )( const T*, D* );
private:
bool _isSuccess;
D& _data;
const FunctionType _function;
public:
explicit DataGuard( D& data, FunctionType& function, const T* ptr );
~DataGuard();
bool isSuccess() const;
};
#define DATAGUARD( Type ) const DataGuard<Type, Type##Data>
#include "DataGuard.inl"
DataGuard.inl
#define GET_FUNCTION_NAME( functionName ) #functionName
template<typename T, typename D>
DataGuard<T,D>::DataGuard( D& data, FunctionType& function, const T* ptr ) :
_data( data ),
_function( function )
{
auto iReturn = function( ptr, &data );
_isSuccess = iReturn == MY_SUCCESS;
if( !_isSuccess ) {
Utility::logErrorMessage( GET_FUNCTION_NAME( _function ), iReturn );
}
}
template<typename T, typename D>
DataGuard<T,D>::~DataGuard() {
if( _isSuccess ) {
_function( NULL, &_data );
}
}
template<typename T, typename D>
bool DataGuard<T,D>::isSuccess() const {
return _isSuccess;
}
Этот вспомогательный класс вызывается так:
DATAGUARD( MyObject ) guard( data, MyObjectGet, ptr );
Проблема заключается в том, что если в конструкторе DataGuard произошла ошибка, выводимое мной сообщение об ошибке показывает _функцию , а не требуемое имя MyObjectGet .
Есть идеи, почему мне не удается выполнить макрос GET_FUNCTION_NAME?