1

我想绑定一个成员来存储类实例之外的函数对象。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++ 中的错误还是我在这里做一些狡猾的事情?

4

2 回答 2

5

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

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

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

于 2013-10-17T16:19:43.993 回答
3

一种替代方法是使用 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取决于它。

于 2013-10-17T16:25:05.483 回答