C++ 在运行时获取具有 ID 的对象
C++ Getting objects with IDs at runtime
假设我们有以下对象:
struct A{
static const int ID = 1;
};
struct B{
static const int ID = 2;
};
struct C{
static const int ID = 3;
};
struct D{
static const int ID = 4;
};
struct Collection{
std::vector<A> o1;
std::vector<B> o2;
std::vector<C> o3;
std::vector<D> o4;
};
Collection collection;
我想做的是获取对Collection
的一些vector
的引用。应该有三种不同的方法来检索这些:
按
vector
类型,例如collection.get<A>();
编译时由 ID 定义,由
vector
持有的每个对象定义,例如collection.get<4>();
- 按运行时的 ID,例如
collection.get(id);
案例1 很容易,因为它可以通过T::ID
转换为案例 2。案例 2 可以通过模板专用化来实现(尽管如果我有很多对象,它看起来很丑(。 案例3制造了很多麻烦。如果没有一些巨大的if
或switch
语句,它几乎是不可能的,更不用说推断返回类型了。
我的问题是:
- 有没有办法让案例 2 更优雅?
- 我应该如何实现案例 3?
有些事情你可以做,有些事情你永远做不到。你所要求的不是那么简单,需要努力工作。
1 和 2 很困难,但可以实现。首先,创建所有类型 ID 的静态映射,然后使用静态结果选择类型。
现在3... 嗯...很抱歉告诉你这是不可能的!提供一个反例来证明我所说的:你永远不能创建一个在运行时选择返回类型的函数。但。。。
你可以做一些事情,这基本上是LLVM人员为摆脱dynamic_cast
所做的,但它的代码太多了。
首先,将一个基抽象类装为例,并使所有这些类都从它派生,并使其包含 ID:
struct Base{
virtual int getClassID() = 0;
static Base* CreateObject(int ID) //consider using shared_ptr here
{
switch(ID) {
case A::ID:
return new A;
}
case B::ID:
return new B;
default:
return nullptr;
}
//...
}
}
struct A : public Base {
static const int ID = 1;
int getClassID() override {
return ID;
}
};
struct B : public Base {
static const int ID = 2;
int getClassID() override {
return ID;
}
};
struct C : public Base {
static const int ID = 3;
int getClassID() override {
return ID;
}
};
struct D : public Base {
static const int ID = 4;
int getClassID() override {
return ID;
}
};
现在,要实例化一个新类,请使用基类。
Base* c = Base::CreateObject(3); //object of C
现在,最后,您创建您的魔术施法运算符:
template <typename T>
T* MyMagicCast(Base* obj)
{
if(obj->getClassID() ISVALID) //Then use the ID to make sure that T matches the ID
{
return static_cast<T*>(obj);
}
else
{
return nullptr;
}
}
这将为您完成运行时的工作。使用此方法,您的优势在于可以通过调用 base + 不使用任何 RTTI 来完成所有类型的操作。现在,仅当您需要特定于您拥有的类型之一(A,B,C,D(时,才使用MyMagicCast()
转换为其类型。
PS:代码在我的头顶上,所以可能有轻微的错别字/错误。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 通过 id 访问 QML 插槽中的嵌套对象(从 c++ 调用)
- "Extern"对象问题:错误:Id 返回 1 个退出状态
- C++ 在运行时获取具有 ID 的对象
- 如何通过id获取线程对象?
- 如何使用 API 获取 QML 对象的 id 属性C++
- 如何将字符串(ID)映射到新的子类对象C 的创建
- 如何通过先前存储的ID从结构对象中检索值?C
- 如何使用make_pair创建一对ID和struct(对象)
- 声明中的限定 ID 在"="令牌/对象计数器变量之前
- 获取每个类的 int Id,使用类名及其对象调用
- 通过 Box2d 中的 NSNotificationCenter 发送类对象C++。错误:没有从 'MyContact' 到 'id' 的可行转换
- C++:父对象在不调用方法的情况下更改其id属性
- 控件的动态对象 ID
- 如何使用C++驱动程序通过对象ID更新MongoDB
- 在std::unordered_map中分配ID后创建对象
- visual在c++中获取对象ID
- 选择随机数作为对象ID
- 我应该为我的不透明对象使用整数ID还是指针?
- 如何确定一个GL帧缓冲对象的宽度和高度只给出相应的id