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()
返回的类型的指针vector<int>
。
致电getArray
:
void test(any_ptr_get_array ptr){
if(ptr){
auto vec = ptr.operation();
}
}
这种技术可以称为使用模板生成的 vtable 的手动类型擦除。