如何在视觉C++中与 4 个以上的占位符进行 std::bind

How do I std::bind with more than 4 placeholders in Visual C++?

本文关键字:占位符 std bind 视觉 C++ 中与      更新时间:2023-10-16

我想绑定一个成员以在类实例之外存储函数对象。Howeber,在VS2012中,这最多只能placeholders::_4,然后它开始弹出错误。举个例子:

#include <iostream>
#include <functional>
using namespace std;
using namespace std::placeholders;
class A
{
    public:
    int method(int a,int b,int c,int d,int e)
    {
        return a;
    }
};
int main()
{
    std::function<int (int,int,int,int,int)> obj;
    A a;
    // error: no instance of overloaded function "std::bind" matches the argument list
    obj = std::bind(&A::method,&a,_1,_2,_3,_4,_5); 
    std::cout << obj(1,2,3,4,5);
   return 0;
}

上面的代码在GCC 4.7.2上编译良好,但在Visual Studio 2012中导致上述错误。是否有任何解决方法,这是VC ++中的错误还是我在这里做了一些狡猾的事情?

由于Visual Studiio不支持可变参数模板,因此可以通过定义来解决。

您可以为所需的参数数量设置定义_VARIADIC_MAX。在项目设置中执行此操作,以便在包含任何系统标头之前设置它。

但请记住,将此值设置为较大的数字会增加编译时间。

一种替代方法是使用 lambda,如下所示:

#include <iostream>
#include <functional>
using namespace std;
using namespace std::placeholders;
class A
{
public:
    int method(int a, int b, int c, int d, int e)
    {
        return a;
    }
};
int main()
{
    std::function<int(int, int, int, int, int)> obj;
    A a;
    obj = [&a](int b, int c, int d, int e, int f){return a.method(b,c,d,e,f); };
    std::cout << obj(1, 2, 3, 4, 5);
    return 0;
}

编辑:如果不遵循@mkaes答案,这似乎也行不通,因为显然std::function的定义取决于它。