gpt4 book ai didi

c++ - 用 C++ 模板替换函数调用的 C 宏?

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

是否可以替换这个预处理器宏:

#define AL_CALL(a) do { a;                              \
ALenum e = alGetError(); \
if(e != AL_NO_ERROR) \
UtilitySoundNode::printALError(e,__FILE__, __LINE__); \
} while(0)

使用 C++ 模板?如果可能的话,这样做是否有意义(优点/缺点 - 开销/调试)?

注意:基本上我想知道在 C++ 中是否有一种优雅的方式来处理这种错误处理。

编辑:当然我弄错了 a 是一个函数调用。正如人们可能猜到的那样,这是一个带有 OpenAL 函数参数的函数调用。

AL_CALL(someAlFunction(param1, param2))

注意:有人决定编辑宏并使其更好,但我更愿意保留原始宏。所以这里是:

#define AL_CALL(a) {a; ALenum e = alGetError();if(e != AL_NO_ERROR)PUtilitySoundNode::printALError(e,__FILE__, __LINE__);}

最佳答案

这里的一个问题似乎是“a”可以是某个任意函数(带有参数),它设置由 alGetError() 返回的错误代码。

可以使用仿函数对象将其重写为 C++。要传递参数(和对象实例,如有必要)可以使用 std::bindboost::bind(注意绑定(bind)引用参数 std: :ref/boost::ref 是必要的)。

但是,如果您仍然希望 __FILE____LINE__ 传递 printError(),那么 C++ 模板仍然需要由宏调用会将它们传递给模板。 __FILE____LINE__ 仅由预处理器扩展,因此无法为它们使用宏。

但是宏可能会简单得多,并且大部分工作都可以在 C++ 模板中完成(它有很多优点,例如用于调试,因为在大多数调试器中您无法进入宏)。

编辑:添加代码作为示例:

template<typename T>
void ALcallAndCheck(T c, const char *file, size_t line)
{
c();
ALenum e = alGetError();
if(e != AL_NO_ERROR)
UtilitySoundNode::printALError(e, file, line); \
}

#define AL_CALL(a) ALcallAndCheck(a, __FILE__, __LINE__)

然后,代替

AL_CALL(SomeFunction(2, refAttr));

调用将变为:

AL_CALL(std::bind(SomeFunction, 2, std::ref(refAttr)));

编辑 2:前一个确实不适用于原始宏允许的表达式。为了也适用于表达式,可以将宏更改为:

#define AL_CALL(a) ALcallAndCheck([&]{ (a); }, __FILE__, __LINE__)

这将创建一个 lambda,它将评估进入宏的任何内容。那么即使 std::bind 也不是必需的,它可以直接调用为:

AL_CALL(SomeFunction(2, refAttr));
AL_CALL(SomeOtherFunction1()+SomeOtherFunction2(8));

关于c++ - 用 C++ 模板替换函数调用的 C 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34373493/

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