检索不同类型的对象指针
Retrieve objects pointers of different type
考虑我有一堆指向不同类的不同对象的指针
class1* obj1;
class2* obj2;
class3* obj3;
它们都有一个方法getArray()
该方法返回一个用于后处理的向量。
如果所有这些指针都存储在某种列表中(空指针列表说(
当我迭代列表时,有没有办法确定可以使用哪种类型的指针转换?
我知道这可以通过类层次结构并从单个类派生上述类来解决。由于其中很多是遗留代码,可以做类似提到的操作吗?
愚蠢的动态不允许我存储指针,这是尝试过的一件事
如果 getArray(( 始终具有相同的签名(或足够相似以强制转换为相同的类型( - 您可以做的是为鸭型遗留对象/类的装饰器创建一个类层次结构。 可以使用非模板接口的模板派生类进行包装,而无需进行太多的键入工作。
类似这些内容(具有更多的防御性编码,可能是指向遗留对象的智能指针等(:
class IDecorator {
public:
virtual std::vector<ubyte> GetArray() = 0;
};
template<typename TLegacyType>
class TDecorator : public IDecorator {
public:
TDecorator(const TLegacyType *ip_legacy_object)
: mp_legacy_object(ip_legacy_object) {}
std::vector<ubyte> GetArray() override {
return mp_legacy_object->GetArray();
}
private:
const TLegacyType *mp_legacy_object;
};
template<class R, class Op>
struct any_ptr {
void* ptr=0;
R(*f)( void* ) = 0;
R operate() const { return f(ptr); }
explicit operator bool() const { return ptr; }
template<class T>
T* as() const { return static_cast<T*>(ptr); }
any_ptr(any_ptr const&)=default;
any_ptr& operator=(any_ptr const&)=default;
any_ptr()=default;
template<class T>
any_ptr(T* p_in):ptr(p_in),
f( [](void* ptr)->R{ return Op{}( ptr ); } )
{}
};
any_ptr
支持存储任何支持 Op
的指针,其中 Op
是返回 R
的无状态函数对象类型。
struct get_array_t{
template<class T>
auto operator()(T* t)const{ return t->getArray(); }
};
using any_ptr_get_array = any_ptr< std::vector<int>, get_array_t >;
现在,any_ptr_get_array
可以存储指向支持返回vector<int>
.getArray()
的任何类型的指针。
要呼叫getArray
:
void test(any_ptr_get_array ptr){
if(ptr){
auto vec = ptr.operation();
}
}
这种技术可以称为使用模板生成的 vtable 的手动类型擦除。
相关文章:
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行