如何为reference_wrappers的静态映射赋值?

问题描述 投票:0回答:1

我有多个从父类派生的子类。我想通过父类的静态方法,基于子类中唯一的参数来解析子类之一的静态字段之一。

由于 C++ 不提供静态初始化,为了做到这一点,我必须在应用程序启动时注册所有子级。我通过

registerClass
来做到这一点。

我的问题:

我收到编译时错误:

error: no matching function for call to 'std::reference_wrapper<std::vector<vk::DescriptorSet> >::reference_wrapper()'

我无法分配给地图内的reference_wrapper,另一方面,我可以通过

std::ref()
分配给地图外的reference_wrapper。

我在这里做错了什么?

代码:

class Parent {
    virtual ~Parent() = default;

    static auto& getRegistry()
    {
        static std::unordered_map<unsigned int, std::reference_wrapper<std::vector<vk::DescriptorSet>>> registry;
        return registry;
    }

    static std::reference_wrapper<std::vector<vk::DescriptorSet>> resolve_sampler_descriptor_sets_by_id(unsigned int id)
    {
        auto& registry = getRegistry();
        auto it = registry.find(id);

        if (it != registry.end())
        {
            return it->second;
        }

        throw std::runtime_error("Object ID not found in registry.");
    }

    static void registerClass(unsigned int id, std::vector<vk::DescriptorSet>& ds)
    {
        getRegistry()[id] = std::ref(ds);
    }
}

class Child : public Parent
{
    inline static const unsigned int TYPE = 1;
    inline static std::vector<vk::DescriptorSet> sampler_descriptor_sets;
}

报名课程:

Child::registerClass(Child::TYPE, Child::sampler_descriptor_sets);
AnotherChild::registerClass(AnotherChild::TYPE, AnotherChild::sampler_descriptor_sets);
c++ reference-wrapper
1个回答
0
投票
getRegistry()[id] = std::ref(ds);

getRegistry()[id]
默认构造引用包装器,然后将右侧分配给它。并且引用包装器没有默认构造函数,您需要使用
emplace
代替。

getRegistry().emplace(id, std::ref(ds));
© www.soinside.com 2019 - 2024. All rights reserved.