【问题标题】:boost::bind, std::bind and overloaded functionsboost::bind、std::bind 和重载函数
【发布时间】:2013-10-07 04:58:34
【问题描述】:

我注意到 boost::bind 与 std::bind 不同,当这些函数之一没有任何参数时,它可以与重载函数一起使用。我对吗?这有记录吗?

#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
}

【问题讨论】:

    标签: c++ boost c++11 boost-bind


    【解决方案1】:

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

    std::bind 是使用可变参数模板实现的 C++11 功能。

    boost::bind是为C++03实现的,也就是说它依赖于大量的重载函数模板。

    两者在实现细节上完全不同,因此,我认为它们的行为之间的任何差异都是由此产生的结果,而不是有意和特定的差异。

    Boost 文档仅说明了这一点: “尝试绑定重载函数通常会导致错误,因为无法判断要绑定哪个重载。”

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

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

    【讨论】:

      【解决方案2】:

      它被记录为“接口”->“概要”部分的一部分,其中列出了重载。正如你所看到的,Boost 使用可变参数模板,因此当给定这些重载时,明确这些:

      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);
      

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-10-15
          • 1970-01-01
          • 2012-05-20
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多