我有一个新的操作符,可以预见,它会从池中分配内存。但是,我还需要知道对象类型来设置一些元字段。我可以将它作为第二个参数传递给new作为字符串,但是因为我在调用new时指定了类型,是不是有任何方法可以隐式得到它?
E.g。我能做到这一点:
void* operator new(size_t count, Pool* pool, const char* type)
{
return pool->alloc(count, type); // type is used to associate metadata with the allocated chunk
}
Car* car = new(pool, "Car") Car(...);
但我不能做这样的事吗?
template<class T>
void* operator new(size_t count, Pool* pool)
{
return pool->alloc(count, typeid(T).name());
}
Car* car = new(pool) Car(...);
答案 0 :(得分:3)
不,抱歉。除了仅适用于您控制的类类型的成员分配器函数之外,C ++既不使用类类型来选择operator new
函数,也不为operator new
函数提供任何标准方法来确定调用的类型new-expression(如果有的话)。
你可以给你的Pool
类一个模板成员函数来处理分配和构建:
template<typename T, typename... Args>
T* Pool::create(Args&& ... args) {
void* ptr = alloc(count, typeid(T).name());
try {
return ::new(ptr) T(std::forward<Args>(args)...);
} catch (...) {
dealloc(ptr);
throw;
}
}
// ...
Car* car = pool->create<Car>(vroom);
(关于你可能已经知道的东西的其他评论:记住在类构造函数抛出异常的情况下实现匹配的placement-delete。考虑建立一个Allocator接口以与标准库兼容。)