Преобразовать шаблонный тип параметра в строку - PullRequest
1 голос
/ 10 апреля 2010

В коде есть немного СУХОГО, которое я и другие написали, что я хотел бы уменьшить, но я не могу понять, как это сделать. Это устаревший код COM, но он мешает удобочитаемости. Я хотел бы сделать следующее:

bool queryInterface<class T, class V>(T &_input, V &_output, Logger &_logger){
    if( FAILED( _input->QueryInterface( &_output ) ) ){
        _logger.error() << "Failed to Query Interface between " << MAGICHAPPENS<T>() 
                        << " and " << MAGICHAPPENS<V>();

        return false;
    }
    if( _output == NULL ){
        _logger.warn() << "Unable to Query Interface between " << MAGICHAPPENS<T>()
                       << " and " << MAGICHAPPENS<V>();

        return false;
    }
}

При этом функция «MAGICHAPPENS ()» выдала бы имя типа переменной. Так что если бы «V» было IQueryFilter, я бы вернул строку «IQueryFilter». Я не могу придумать какое-либо разумное решение, не написав кучу шаблонных специализаций, полностью обойдя этот вопрос.

Есть ли способ написать ANDMAGICHAPPENS?

1 Ответ

2 голосов
/ 10 апреля 2010

Вы можете использовать RTTI, чтобы получить имя переменной:

#include <typeinfo>

template <typename T>
const char* type_name(void)
{
    // this, unfortunately, is implementation defined
    // and is allowed to be an empty string (useless!)
    return typeid(T).name(); 
}

_logger.error() << "Failed to Query Interface between " << type_name<T>() 
                    << " and " << type_name<V>();

Как говорится в комментариях, name() не гарантирует какого-либо конкретного форматирования имени или какого-либо имени вообще. Но для этого нужен RTTI, который некоторым не нравится.

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