我有一个助手类定义如下:
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构造函数中有错误,我打印的错误消息显示的是_function,而不是所需的MyObjectGet函数名。
你知道为什么GET_FUNCTION_NAME宏会让我失望吗?
发布于 2018-11-07 17:02:06
你不能从函数内部去做。
你可以在外部做:
DATAGUARD( MyObject ) guard( data, MyObjectGet, ptr );我要改变这一点:
#define DG(data, func, ptr) data, func, ptr, #func
// usage is now:
DATAGUARD( MyObject ) guard(DG(guard, data, MyObjectGet, ptr));您将注意到,我们将函数指针和函数指针的名称作为最后一个参数作为引用字符串传递。可以将此字符串用作错误消息的一部分。
https://stackoverflow.com/questions/53194063
复制相似问题