Получить имя функции указателя функции с помощью макроса # не работает - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть вспомогательный класс, определенный следующим образом:

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?

1 Ответ

0 голосов
/ 07 ноября 2018

Вы не можете сделать это изнутри функции.

Вы можете сделать внешне:

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));

Вы заметите, что мы передаем указатель функции и имя указателя функции в виде строки в кавычках в качестве последнего параметра. Вы можете использовать эту строку как часть вашего сообщения об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...