我的问题是测试std::shared_ptr
以查看它是否属于某种类型。
我正在使用名为instanceof
的函数来测试我是否可以执行std::static_pointer_cast<>
。问题是当将std :: shared_ptr传递给我的instanceof函数时,它将shared_ptr视为shared_ptr的类型,而不是shared_ptr所持有的数据的实际类型。
类层次结构
Object
|
--- Item
通过示例进一步说明。
// Type.h
template <class Base = Object, class Derived>
inline bool instanceof(const std::shared_ptr<Derived>&)
{
return std::is_base_of_v<Base, Derived>;
}
// ObjectDB.h
class ObjectDB
{
public:
std::shared_ptr<Object> getObject(const char* obj_name);
}
// main.cpp
auto obj = gObjectDB.getObject("torch");
if (instanceof<Item>(obj))
{
if (auto item = std::static_pointer_cast<Item>(obj))
{
}
}
在上面的示例中,instanceof
变为instanceof<Item, Object>
,这意味着instanceof将返回false,因为它需要instanceof<Item, Item>
。我尝试使用instanceof<Item, std::remove_reference_t<decltype(*obj)>>
按照在线的几个来源的建议,但这最终仍然是instanceof<Item, Object>