我的模块系统设计正在尝试在声明之前使用类型名。如何设计更好的模块布局?

My module system design is trying to use typenames before their declaration. How can I design better module layout?

提问人:xarxarx 提问时间:5/8/2023 最后编辑:apple applexarxarx 更新时间:5/8/2023 访问量:40

问:

我正在尝试为我的游戏引擎创建模块系统,但我遇到了一个问题。有两个类和 . 类存储类及其所有组件。我希望该类能够指定需要注册的参数,但在定义它们之前不能使用它们。ModuleModuleFactoryModuleFactoryModuleModuletypenames


ModuleFactory类:

template<typename Base, typename TCreateValue, typename ... Args>
class ModuleFactory {
public:
    using TRegistryMap = std::unordered_map<TypeId, TCreateValue>;

    static TRegistryMap &ModuleRegistry() {
        static TRegistryMap registry;
        return registry;
    }

    template<typename T>
    class Registry : public Base {
    public:
        static T* Get() {
            return moduleInstance;
        }

    protected:
        static bool Register(Args ... args) {
            ModuleFactory::Registry()[TypeInfo<Base>::template GetTypeId<T>()] = {[]() {
                moduleInstance = new T();

                return std::unique_ptr<Base>(moduleInstance);
            }, args...};

            return true;
        };

        inline static T *moduleInstance = nullptr;
    };
};

Module类:

class Module : public ModuleFactory<Module, Module::TCreateValue, Module::Stage> { 
//You can't use TCreateValue and Stage before their declaration, so this throws error.
public:
    enum class Stage : uint8_t {
        Never, Always, Pre, Tick, Post, Render
    };

    class TCreateValue {
    public:
        std::function<std::unique_ptr<Module>()> create;
        Stage stage;
    };
    
};

只:SomeClass

class SomeClass : public Module::Registry<SomeClass> {
    inline static bool Registered = Register(Stage::Always);
};

正如我之前所说,我希望类能够设置注册所需的参数。关于如何解决这个问题或重新设计我的模块布局并仍然实现相同目标的任何想法。我唯一的想法就是在课外移动,但我不想在我的代码中弄得一团糟。ModuleTCreateValueStageModule

C++ C++17 类型名

评论


答: 暂无答案