std::bind 有多少个参数(VC 11 只支持 4 个)

Posted

技术标签:

【中文标题】std::bind 有多少个参数(VC 11 只支持 4 个)【英文标题】:How many arguments to std::bind (VC 11 only supports 4) 【发布时间】:2012-02-05 10:41:59 【问题描述】:

我正在使用 Visual Studio 11 的开发者预览版。

我偶然发现的一个缺点是 std::bind 仅支持 4 个函数参数。

我在 C++11 标准文件中找不到任何关于此的内容。是否定义了最小数量的参数,还是所有实现都依赖于?

【问题讨论】:

【参考方案1】:

在 VC11 中,您可以通过设置 _VARIADIC_MAX 来增加可变参数模板仿真方案使用的最大参数数量。默认为 5。

请看这里: http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

如果您需要更多参数(例如,您有使用 VC9 SP1 编译的代码 或使用 6 元组的 VC10),有一个逃生舱口。你可以定义 _VARIADIC_MAX 项目范围在 5 到 10 之间(默认为 5)。增加它会使编译器消耗更多的内存,并且可能 要求您使用 /Zm 选项为 PCHe 保留更多空间。

【讨论】:

【参考方案2】:

实际上,这是 VC11 尚不支持可变参数模板的暗示。然而,他们可以硬编码超过四个。 Boost 库一直使用样板文件执行此操作,最多可处理 10 个参数(例如在 details 目录中检查信号 2)。四个参数实在是太少了。

【讨论】:

【参考方案3】:

这是一些依赖于实现的值。如果超过参数的数量,实现可能会崩溃或做其他愚蠢的事情。实际的 C++11 实现在这里使用可变参数模板(VC++ 还没有该功能),因此它们的限制对每个人来说应该绰绰有余。

这是一种未定义行为的情况,超出了实现限制。与您尝试将 1TB 文件输入编译器并耗尽内存没有什么不同。

【讨论】:

std::bind 是可变参数,tr1::bind 是实现定义的数量,不是吗?这个名字看起来不对。 @spraff 模板参数的数量和函数参数的数量都受特定于实现的限制。

以上是关于std::bind 有多少个参数(VC 11 只支持 4 个)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::bind 不能作为参数包的参数?

C++11 std::bind函数,std::function函数

C++ STL应用与实现22: 函数组合之1:如何使用std::bind (since C++11)

C++11之用std::function和std::bind实现观察者模式

将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 的函数时出错?

C++11新特性应用--实现延时求值(std::function和std::bind)