C ++: создание параметризованного указателя из строки - PullRequest
1 голос
/ 22 марта 2012

У меня есть устаревший интерфейс, который дает мне тип экземпляра в форме строки, например, «int», «float» и т. Д.

Я решил использовать эти две функции для решения проблемы:

template <typename T>
T type_factory(const std::string& type_id)
{
    if (!type_id.compare("long"))
    {
        long res;
        return res;
    }

    if (!type_id.compare("double"))
    {
        double res;
        return res;
    }

    if (!type_id.compare("char"))
    {
        char res;
        return res;
    }
}

и

template <class PointerClass, typename T>
PointerClass<T>* pointer_factory(void* ptr, T dummy_type)
{
    return static_cast<PointerClass<T>*>(ptr);
}

//Desidered usage:
//void* raw_ptr;
//Calculator<int>* p = pointer_factory<Calculator>(raw_ptr, type_factory("int"));

Вторая функция не компилирует ошибку "ожидаемый неквалифицированный идентификатор" возле PointerClass.

Может кто-нибудь сказать, почему вторая функция не компилируется и как ее исправить?

Заранее спасибо.

1 Ответ

2 голосов
/ 22 марта 2012

Похоже, вам нужен шаблон шаблона:

template < template<typename T> class PointerClass, typename T>
PointerClass<T>* pointer_factory(void* ptr, T dummy_type) 

вместо

template <class PointerClass, typename T>
PointerClass<T>* pointer_factory(void* ptr, T dummy_type)

, поскольку PointerClass сам является шаблоном.

Это исправляет ошибку компиляции, вам придется проверить, выполняет ли она то, что вам нужно, хотя я сомневаюсь, что так и будет.

EDIT:

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

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