std :: bind和模板化成员函数出错

时间:2017-11-02 01:02:51

标签: c++ function c++11 templates pointers

我目前正在编写一个用于练习C ++的gameboy模拟器。我已经到了实现CPU指令的部分,并确定了std :: function的向量是一个不错的选择。

请注意:u8uint8_t的别名。

在我的代码中,有一个std::function<u8()>向量,有三种类型的成员:

  1. 返回u8的lambda表达式。
  2. 指向会员功能的指针。
  3. 指向模板化成员函数的指针。
  4. 我最初尝试使用initalizer列表,但它没有用。我后来发现这是因为我需要在指针上调用std::bind(/*function ptr*/, this);,但是当在模板化函数指针上调用它时,我得到以下错误:no matching function for call to 'bind'。我想有一个初始化列表,因为现在它是一个连续调用emplace_back的函数。

    这是错误行:

    instruction_set.emplace_back(bind(&CPU::OPLoadDualRegister8<B, B>, this)); // 0x40 LD B, B

    有趣的是,当B被文字(例如0x00)取代时,它的效果非常好。 Bu8,这是模板接受的内容。

    所以:

    1. 我有什么方法可以做到这一点不那么令人费解? (例如,init列表,带成员函数ptrs的std :: function等)
    2. 如果这是最好的方式,我该如何处理模板化的ptrs?
    3. 如果我将模板参数作为参数并使用std::bind来解决它们(所有参数都是u8u8&,那会更好。
    4. 有任何优化建议吗?
    5. 谢谢,扎克。

1 个答案:

答案 0 :(得分:0)

好的,你的问题和评论之间有很多关系。以下是我发现的一些事情:

  1. 如果您要索引一个矢量来解码操作码,您可能不应该按顺序将emplace_back插入到矢量中。而是将向量增长到最终大小,用空值填充它,并使用下标运算符将函数放入。instruction_set[0x40] = ...

  2. 使用switch语句并直接调用函数可能是更好的选择。显然,不知道你项目的细节,所以这可能是不可能的。

  3. 当您说Bu8时,您的意思是Bu8类型的变量吗?普通的变量不能用于实例化模板。 B必须是调用函数constexpr变量或static const上的宏模板参数(在编译时基本上已知)。

  4. std::bind对任何人来说都没有任何乐趣,所以你并不孤单。我不认为这是你问题的根本原因,但你应该更喜欢使用捕捉lambdas来绑定东西。

  5. 有趣的是,去年C ++的新心形电影师Matt Godbolt(Compiler Explorer的作者)给了talk on emulating a 6502 in JavaScript。它不完全是关于这个主题的权威参考,但如果你对模拟旧的微处理器感兴趣,可能值得一看。

相关问题