【问题标题】:How do I std::bind with more than 4 placeholders in Visual C++?如何在 Visual C++ 中 std::bind 与超过 4 个占位符?
【发布时间】:2013-10-17 16:16:11
【问题描述】:

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

【问题讨论】:

  • MSVS2013 刚刚发布。就用它吧。
  • 代码用VS2010编译得很好。

标签: c++ visual-studio-2012


【解决方案1】:

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

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

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

【讨论】:

  • 实际上,it appears to -- 只是没有使用默认工具集。
  • @cdhowie,我认为 VS2013 也好一些。 CTP 有很多错误。
  • 项目设置中如何设置?我尝试添加_VARIADIC_MAX 6,但它不喜欢它...
【解决方案2】:

另一种方法是使用 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 的定义取决于它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2020-03-12
    • 2020-03-19
    • 1970-01-01
    • 2014-03-25
    • 2017-10-16
    • 2018-04-14
    相关资源
    最近更新 更多