这是一个非常简单的类型擦除实例:
// Type erasure side of things
class TypeErasedHolder
{
struct TypeKeeperBase
{
virtual ~TypeKeeperBase() {}
};
template
struct TypeKeeper : TypeKeeperBase
{
ErasedType storedObject;
TypeKeeper(ErasedType&& object) : storedObject(std::move(object)) {}
};
std::unique_ptr held;
public:
template
TypeErasedHolder(ErasedType objectToStore) : held(new TypeKeeper(std::move(objectToStore)))
{}
};
// Client code side of things
struct A
{
~A() { std::cout << "Destroyed an A\n"; }
};
struct B
{
~B() { std::cout << "Destroyed a B\n"; }
};
int main()
{
TypeErasedHolder holders[] = { A(), A(), B(), A() };
}
如您所见,TypeErasedHolder可以存储任意类型的对象,并正确销毁它们.重要的是,它不会对所支持的类型(1)施加任何限制:例如,它们不必从公共基础派生.
(1)当然,除了可移动之外.