gpt4 book ai didi

c++ - 产生可疑错误的宏

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:10 25 4
gpt4 key购买 nike

我一直在用 C++ 编写内存管理器,并且一直在使用宏来代替对 new 的传统调用。这背后的插入力是双重的:我需要捕获有关所请求分配的类型信息,并且我想生成干净的语法。当然,对于宏来说,这是一项艰巨的任务。但这是我想出的:

#define anew( TYPE ) new ( Allocator::Instance( )->Allocate<TYPE>( ) ) TYPE

它调用分配器在内存池中为 TYPE 类型的对象(相对于宏)分配一个位置。然后它使用 Allocate 返回的指针作为放置 new 的参数,允许构造函数在这个新“分配”的内存块上运行。到目前为止是有道理的。所以在正常使用中,它是这样展开的:

Obj* a = anew( Obj )( );
Obj* a = new ( Allocator::Instance( )->Allocate<Obj>( ) ) Obj( );

这很好用!但是当我尝试将它与具有多个参数的模板类一起使用时,它会爆炸(我的意思是它会产生错误)。

Obj<int, bool>* a = anew( Obj<int, bool> )( );

这提示没有足够的类型参数提供给模板参数。经过一番摸索,我明白这是因为模板参数中的逗号。既然如此,我该如何解决

更好的是,有没有更好的方法来做到这一点?我觉得把它变成一个宏是有意义的,因为我真的只想在这里进行一些直接文本替换。但是我会从不同的方式处理这个问题中得到什么吗?是否可以在不使用宏的情况下完成此操作?我试过这条路线,出现的问题是调用构造函数。以下代码无效,但它会很好:

Obj* a = anew<Obj>( );

括号只能对应给定类型的有效构造函数。

如有任何帮助,我们将不胜感激。谢谢!

[编辑]

虽然Variadic Macros也解决了我的问题,我在下面选择的答案是我认为是解决我的问题的最佳 C++ 解决方案。谢谢大家如此迅速地解决了这个问题。

最佳答案

使用 C++11,您可以这样做:

template <typename T,typename... Args>
T* anew(Args&&... args)
{
return new(Allocator::Instance()->Allocate<T>()) T(std::forward<Args>(args)...);
}

现在您可以使用这种形式:

Obj* a = anew<Obj>( );

并将参数的任何内容(或不传递)传递给构造函数。

std::forward 是允许将参数从一个函数转发到另一个函数的通用机制。它依赖于右值引用和模板引用折叠的技巧,使其能够正确有效地传递左值和右值。结合可变参数,这允许以这种方式完美转发任意数量的参数。

关于c++ - 产生可疑错误的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com