Получение имени типа типа шаблона без определения класса - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь написать шаблонную оболочку, которая работает с типом smart_ptr, и в некоторых случаях необходимо создать исключение. Для этого случая я хотел бы включить имя типа, который обертывает класс. Поскольку я работаю со смарт-указателями, для типа будут доступны только предварительные объявления.

Итак, основной вопрос заключается в том, как получить строку для параметра шаблона, не имея доступного его определения? (Мне не нужно чистое имя, все, что напоминает имя, будет в порядке)

Моя попытка использовать typeid не удалась, поскольку она требует определения класса (по крайней мере, в GCC).

Код, который мне необходим для работы, приведен ниже (который выдает ошибку в GCC)

#include <boost/shared_ptr.hpp>

using boost::shared_ptr;
class SomeClass;

void func( shared_ptr<SomeClass> obj );

template<class T>
class Wrap
{
    shared_ptr<T> ptr;
public:
    shared_ptr<T> get()
    {
        if( !ptr )
            throw std::string(typeid(T).name());
        return ptr;
    }
};

extern Wrap<SomeClass> wrapSomeClass;

int main()
{
    func( wrapSomeClass.get() );
}

(Эта установка привела к моему плохо сформулированному предыдущему вопросу - сообщение об ошибке немного запутанно)

Ответы [ 2 ]

1 голос
/ 29 июня 2011

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

0 голосов
/ 29 июня 2011

Хорошо, я нашел несколько возможностей; но, надеюсь, кто-то другой может придумать лучший ответ.

  1. Используйте макрос для создания extern, поскольку токен # может захватить имя, поэтому достаточно легко передать эту строку в шаблон.

  2. Если я действительно не забочусь о брошенной строке, я могу сделать typeid(T*), поскольку для этого явно не нужен тип.

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