首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::bind、std::bind和重载函数

boost::bind、std::bind和重载函数
EN

Stack Overflow用户
提问于 2013-10-07 12:58:34
回答 3查看 752关注 0票数 2

我注意到,boost::bind与std::bind不同,当重载函数中的一个函数没有任何参数时,它可以处理这些函数。我说的对吗?这有记录下来吗?

代码语言:javascript
运行
复制
#include <boost/bind.hpp>

#include <functional>
#include <iostream>

void foo()
{
    std::cout << "::foo() \n";
}

void foo(int)
{
    std::cout << "::foo(int) \n";
}

int main()
{
    boost::bind(foo)(); // Ok
    boost::bind(foo, 0)(); // Ok

    // std::bind(foo)(); // Error
    // std::bind(foo, 0)(); // Error
}

#include <boost/bind.hpp>

#include <functional>
#include <iostream>

void foo(int)
{
    std::cout << "::foo(int) \n";
}

void foo(const std::string&)
{
    std::cout << "::foo(const std::string&) \n";
}

int main()
{
    // boost::bind(foo, 0)(); // Error
    // boost::bind(foo, "str")(); // Error

    // std::bind(foo, 0)(); // Error
    // std::bind(foo, "str")(); // Error
}
EN

回答 3

Stack Overflow用户

发布于 2013-10-07 14:23:27

我假设这只是实现细节的意外产物,我不认为Boost提供任何关于自动解决正确重载的保证。

std::bind是一个使用可变模板实现的C++11特性。

boost::bind是为C++03实现的,这意味着它依赖于大量重载的函数模板。

这两者在实现细节上有很大的不同,因此,我认为他们的行为之间的任何差异都是这种差异的结果,而不是故意和指定的差异。

Boost文档只说明了这一点:“试图绑定一个重载函数通常会导致错误,因为没有办法知道应该绑定哪个重载。”

在我的书中,这意味着Boost文档告诉你,这是“未定义的行为”,这是否会工作(编译),甚至选择正确的重载。

据我所知,您应该始终使用显式强制转换(static_cast)来修复您希望选择的重载的签名。这对于boost::bindstd::bind都是正确的,在这个意义上,两种实现都是一致的。

票数 3
EN

Stack Overflow用户

发布于 2013-10-07 14:30:32

它被记录为“接口”->“概要”部分的一部分,其中列出了重载。正如你在那里看到的,Boost不使用可变模板,因此当给定这些重载时,显式地:

代码语言:javascript
运行
复制
template<class R> unspecified-2 bind(R (*f) ());
template<class F, class A1> unspecified-3-1 bind(F f, A1 a1);
template<class R, class B1, class A1> unspecified-4 bind(R (*f) (B1), A1 a1);

编译器更喜欢具有空参数列表的重载版本,因为它是更好的匹配。不过,我不认为这是故意的。

票数 2
EN

Stack Overflow用户

发布于 2013-10-07 18:37:56

第一种情况在MSVC10中使用stdboost都能很好地编译(因为MSVC10不支持可变模板,所以std::bind的实现类似于boost::bind)。

第二种情况无法编译,因为bind可以解析具有不同性质的重载,但不能解析仅因参数类型不同而不同的重载。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19217353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档