【问题标题】:boost::bind with overloaded functions?boost::bind 与重载函数?
【发布时间】:2012-04-13 02:13:34
【问题描述】:

我有两个具有以下签名的重载成员函数:

class MyClass
{
    void f(int, int, int);
    void f(int, int, int, double);
};

我使用 boost::bind 如下:

boost::bind(&MyClass::f, _1, 1, 2, 3); // _1 is a placeholder for the implicit parameter

我的问题其实是没有问题。根据 boost::bind 文档(http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#err_overloaded),这应该“通常”导致错误,我应该需要转换为函数指针类型。但是我的代码编译没有错误,并且似乎按预期运行。

文档中给出的示例是重载函数的唯一区别是一个是 const 而另一个不是。因此,我的猜测是我没有问题,因为编译器可以分辨出两个重载函数之间的区别,因为参数的数量(和类型)不同,而在文档的示例中没有办法编译器通过传递给 boost::bind 的参数来告诉你想要哪个版本。另一方面,我对我的猜测持怀疑态度,因为我质疑编译器如何知道在我的示例中传递给 boost::bind 的最后 3 个参数链接到第一个参数中的函数指针(因此构成其签名的一部分) - 在我看来,这是 boost::bind 的内部问题,编译器应该不知道。

我在谷歌上搜索这个问题时找不到的文档和任何其他建议都没有说明只有具有相同参数类型的重载函数存在问题。因此,在我开始依赖我的代码(可能是错误的)有效假设之前,如果有人能确认我的猜测是正确的(并且暗示,为什么我的怀疑是错误的),我将不胜感激。我担心的是编译器只是根据我不打算的推理来选择要绑定的函数,例如选择它遇到的第一个。

【问题讨论】:

  • 什么编译器可以让您在不消除歧义的情况下执行&MyClass::f
  • 您是否在目的上使用古老的工具集? ;-]
  • 在这种情况下,std::bind 附带的版本可能会作为您需要的未来版本的功能。 ;-] 不过老实说,我不能足够强调标准库在 VC++ 2010 中的改进程度。我理解并同情对成本的担忧,但是考虑到 Express 版本没有提供您需要的什么你还是使用 Qt 而不是 MFC?
  • 不只是功能,想想在 7 年左右的时间里修复了多少错误。
  • Express 不附带 Windows SDK 或x64 编译器,但可以通过安装Windows SDK 轻松解决。 :-]

标签: c++ boost


【解决方案1】:

如果只有一个选择在语义上是正确的,那么你很好(就像你的例子一样)。如果有更多,不要猜测它会选择什么,选择它(就像在 boost 的例子中一样)。
由于 bind 与 c++ 中的所有其他内容一样是强类型的,因此编译器不能只缩小函数或其他内容,因此不会像在您的示例中选择第一个那样做出不可能的选择。

【讨论】:

  • 好的,我想我明白你的意思了。查看 boost::bind,我可以看到它有 77 个版本。我猜他们已经为传递给它的函数的每个允许的参数数量(直到某个上限)做了一个版本,并将函数指针参数的类型链接到每个参数中其他参数的类型case, 这样当编译器选择传递哪个函数时,它必须匹配相同的类型?
  • @JBentley 对此评论问题的回答是否有任何更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2016-11-28
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多