我有多个从父类派生的子类。我想通过父类的静态方法,基于子类中唯一的参数来解析子类之一的静态字段之一。
由于 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);
getRegistry()[id] = std::ref(ds);
getRegistry()[id]
默认构造引用包装器,然后将右侧分配给它。并且引用包装器没有默认构造函数,您需要使用 emplace
代替。
getRegistry().emplace(id, std::ref(ds));