如何在视觉C++中与 4 个以上的占位符进行 std::bind
How do I std::bind with more than 4 placeholders in Visual C++?
我想绑定一个成员以在类实例之外存储函数对象。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
的定义取决于它。
相关文章:
- 将模板与类模板扣除占位符参数匹配
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- Tensorflow C++ 占位符初始化
- std::bind 不会接受 bind 占位符的 std::cref - 为什么?
- qt 中的占位符
- std::绑定可变参数模板、绑定参数和占位符
- 在另一个函数中使用std::bind返回对象和占位符作为参数
- 是否可以在 c++11 中扩展 std::tie 以接受占位符?
- C++std::cin制作一个占位符
- std::bind 占位符的重载运算符
- 将带有占位符的绑定结果存储在 std::函数中
- 如何在视觉C++中与 4 个以上的占位符进行 std::bind
- G++ 错误:“占位符”不是使用命名空间 std::p laceholders; 的命名空间名称
- std::函数回调,参数采用观察者模式(寄存器主题上的占位符)
- 在对象中存储一个std::函数,该函数包括std::占位符
- 为什么 std::bind 的占位符不使用非类型模板参数实现?
- 省略std::bind中的std::占位符
- 为什么在这种情况下std::bind中需要占位符
- 无法从 Boost.Spirit 中的占位符构造 std::string
- 为什么在这个例子(成员函数)中没有占位符std::bind不能工作?