【发布时间】:2011-04-22 12:52:40
【问题描述】:
我有一个带有函数指针的函数构建。我认为尝试将此功能与预处理器宏交换可能会更快。至少,我想试试这个宏,这样我就可以测量它是否会生成更快的代码。
差不多是这样的:
typedef int (Item::*GetterPtr)(void)const;
typedef void (Item::*SetterPtr)(int);
void doStuff(Item* item, GetterPtr getter, SetterPtr setter, int k)
{
int value = (item->*getter)();
// .. Do some stuff
(item->*setter)(newValue);
}
它被称为
// ...
doStuff(&item, &Item::a, &Item::setA, _a);
doStuff(&item, &Item::b, &Item::setB, _b);
doStuff(&item, &Item::c, &Item::setC, _c);
// ...
我认为可以将其替换为以下内容:
#define DO_STUFF(item, getter, setter, k) do { \
int value = item ## -> ## getter ## (); \
//... \
item ## -> ## setter ## (newValue); \
} while(0);
但它给了我这样的错误:
错误:粘贴“)”和“setA”未提供有效的预处理令牌
有没有办法将函数名和它的对象连接起来?
【问题讨论】:
-
@Donotalo 代替 doStuff(&item, &Item::a, &Item::setA, _a);我称之为 DO_STUFF(ptr_to_item, a, setA, _a);
-
如果您只是想测试性能并且无法让繁琐的宏工作,请不要使用宏。只需将宏替换所产生的代码手写写出来即可。
标签: c++ concatenation c-preprocessor