检索不同类型的对象指针
Retrieve objects pointers of different type
考虑一下我有一堆指向不同 classes
的不同对象的指针
class1* obj1;
class2* obj2;
class3* obj3;
它们都有一种方法 getArray()
,其中 returns 一个用于 post 处理的向量。
如果所有这些指针都存储在某种列表中(例如空指针列表)
当我迭代列表时,有没有办法确定可以使用哪种类型的指针转换?
我知道这可以通过 class 层次结构并从单个 class 派生上述 classes 来解决。由于其中很多是遗留代码,是否可以完成提到的内容?
Folly dynamic 不允许我存储指针,这是我尝试过的一件事
如果 getArray() 始终具有相同的签名(或足够相似以转换为相同类型)- 您可以做的是为 decorator of the duck-typed 遗留 [=16] 创建一个 class 层次结构=].您可以使用 non-template 接口的模板派生 class 进行包装,而无需过多的打字工作。
沿着这些方向的东西(具有更多防御性编码,可能是指向遗留对象的智能指针等):
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
可以存储指向支持 .getArray()
且 returns vector<int>
.
的任何类型的指针
拨打getArray
:
void test(any_ptr_get_array ptr){
if(ptr){
auto vec = ptr.operation();
}
}
这种技术可以称为使用模板生成的 vtable 的手动类型擦除。
考虑一下我有一堆指向不同 classes
的不同对象的指针class1* obj1;
class2* obj2;
class3* obj3;
它们都有一种方法 getArray()
,其中 returns 一个用于 post 处理的向量。
如果所有这些指针都存储在某种列表中(例如空指针列表)
当我迭代列表时,有没有办法确定可以使用哪种类型的指针转换?
我知道这可以通过 class 层次结构并从单个 class 派生上述 classes 来解决。由于其中很多是遗留代码,是否可以完成提到的内容?
Folly dynamic 不允许我存储指针,这是我尝试过的一件事
如果 getArray() 始终具有相同的签名(或足够相似以转换为相同类型)- 您可以做的是为 decorator of the duck-typed 遗留 [=16] 创建一个 class 层次结构=].您可以使用 non-template 接口的模板派生 class 进行包装,而无需过多的打字工作。
沿着这些方向的东西(具有更多防御性编码,可能是指向遗留对象的智能指针等):
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
可以存储指向支持 .getArray()
且 returns vector<int>
.
拨打getArray
:
void test(any_ptr_get_array ptr){
if(ptr){
auto vec = ptr.operation();
}
}
这种技术可以称为使用模板生成的 vtable 的手动类型擦除。