我知道"C++代表"的主题已经完成,而http://www.codeproject.com和http://stackoverflow.com都深深地涵盖了这个问题.
一般来说,似乎Don Clugston最快的代表是许多人的首选.还有一些其他流行的.
但是,我注意到这些文章中的大多数都是旧的(大约在2005年),并且许多设计选择似乎都是考虑到VC7之类的旧编译器.
我需要一个非常快速的代理实现音频应用程序.
我仍然需要它可移植(Windows,Mac,Linux),但我只使用现代编译器(VC9,VS2008 SP1和GCC 4.5.x中的编译器).
我的主要标准是:
此外,我真的不需要异国情调的功能.我只需要一个好的旧指针到方法的东西.无需支持静态方法,自由函数或类似的东西.
截至今天,推荐的方法是什么?仍然使用唐的版本?或者是否存在关于另一种选择的"社区共识"?
我真的不想使用Boost.signal/signal2,因为它在性能方面是不可接受的.对QT的依赖也是不可接受的.
此外,我在google搜索时看到了一些较新的库,例如cpp-events,但我找不到任何来自用户的反馈,包括SO.
struct B
{
void (B::*pf)(int, int); // data member
B () : pf(&B::foo) {}
void foo (int i, int j) { cout<<"foo(int, int)\n"; } // target method
};
int main ()
{
B obj;
// how to call foo() using obj.pf ?
}
Run Code Online (Sandbox Code Playgroud)
在上面的测试代码中,pf是一个数据成员B.调用它的语法规则是什么?它应该是直截了当的,但我没有得到正确的匹配.例如,如果我尝试,obj.*pf(0,0);那么我得到:
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写Gameboy模拟器代码,我想使用函数指针向量来调用正确的函数,而不是执行long switch语句.
例如,如果程序计数器指向0x00(在内存中),则向量的第一个元素是NOP,因此调用void NOP(); 但我无法想象如何调用这些函数.
Z80.h
#include <vector>
using namespace std;
class Z80;
typedef void (Z80::*function_t)();
class Z80
{
public:
vector<function_t> fmap;
...
...
};
Run Code Online (Sandbox Code Playgroud)
Z80.cpp
Z80::Z80()
{
fmap = { &Z80::NOP, &Z80::LDBCnn, &Z80::LDBCmA};
}
void Z80::emulateCycle() {
opcode = memory.readByte(r.pc);
fmap[opcode](); <---ERROR
r.pc++;
}
void Z80::NOP() {
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
IntelliSense: expression preceding parentheses of apparent call must have (pointer-to-) function type
Run Code Online (Sandbox Code Playgroud)