Загрузка из std::map в шаблон

171
07 октября 2021, 11:00

Сделал частитчно менеджер загрузки спрайтов и моделей 3d. Загружается через load_manager. Вот так.

Sprite *sp = load_manager<Sprite>::getModel ( "schar_00" );

А вот код класс load_manager.

#include "object.h"
#include "model.h"
#include "sprite.h"
#include <map>
#include <string>
template<typename T>
class load_manager {
        private:
                static std::map <std::string,Object *> map;
        public:
                static T *getModel ( const char *s ) {
                        std::string path ( s );
                        T *view = map [ path ];
                        if ( view ) return view;
                        view->read_file ( s );
                        map [ path ] = view;
                        return view;
                }
};

Так как я создал std::map < object * >, то хотел бы, чтобы T *view = map [ path ] работала. Почему не может быть преобразована, если Sprite наследуется от Object? Как мне решить эту проблему? Сделал преобразование, теперь ошибки такие.

/tmp/ccyZsl4K.o: In function `load_manager<Sprite>::getModel(char const*)':
/home/cf/projects/editor/./src/menu/../engine/load_manager.h:14: undefined reference to `load_manager<Sprite>::map[abi:cxx11]'
/home/cf/projects/editor/./src/menu/../engine/load_manager.h:18: undefined reference to `load_manager<Sprite>::map[abi:cxx11]'

Что указывает на строки где было преобразование.

Answer 1

Так как load_manager содержит и работает с конкретными типами, то сделать его шаблонным не имеет никакого смысла. Его статический член map является таблицей, для которого mapped_type есть Object*, и он может содержать и адреса своих производных классов, так что при инициализации вы можете туда записать и Sprite*, но вы не можете без явного преобразования присвоить указателью Sprite* указатель на Object, но наоборот можно. Вы могли бы написать так:

class load_manager {
private:
    static std::map <std::string, Object*> map;
public:
    static Object* getModel(const char* s) {
        std::string path(s);        
        if (!map[path])
           map[path]->read_file(s);
        return map[path];
    }
};

И...

Object* sp = load_manager::getModel("schar_00");
READ ALSO
webcomponent почему элемент выпал из потока?

webcomponent почему элемент выпал из потока?

Задача: организовать максимально простое программное добавление/удаление строк в таблицу

157
Не вызывается async функция

Не вызывается async функция

JS(React native) только изучаю после JAVA, не пойму понять в чем фишка и почему не вызывается функция async внутри функции? Где моя ошибка?

99
Правильно ли использовать setTimeoiut в качестве установки последовательности?

Правильно ли использовать setTimeoiut в качестве установки последовательности?

Можно ли использовать setTimeout в качестве установки последовательности? Или может есть лучшие варианты как это сделать? Для примера вот небольшая...

67
Вызов WebAssembly из JavaScript

Вызов WebAssembly из JavaScript

У меня есть программа C++ на 1000+ строкПрограмма состоит из одной функции, которая принимает на вход пять unsigned int (или 1 unsigned char и 4 unsigned int), возвращая...

92