C 11 std ::函数是否限制函数指针可以拥有的参数数量?

我正在使用Visual Studio 11测试版,我很好奇编译错误我正在我的类中存储一个std :: function对象.

typedef std::function<void (int, const char*, int, int, const char*)> MyCallback;

在我班上,

MyCallback m_callback;

这个编译很好.如果我在列表中添加一个参数,它将失败.

typedef std::function<void (int, const char*, int, int, const char*, int)> MyCallback;

失败是:

>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(535): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (int,const char *,int,int,const char *,int)
1>          ]
1>          f:\development\projects\applications\my.h(72) : see reference to class template instantiation 'std::function<_Fty>' being compiled
1>          with
1>          [
1>              _Fty=void (int,const char *,int,int,const char *,int)
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(536): error C2504: 'type' : base class undefined
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (int,const char *,int,int,const char *,int)
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2146: syntax error : missing ';' before identifier '_Mybase'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

这是一个动态链接库,正在准备数据传递给另一个应用程序.我可以重写数据的格式,以便可以通过较少的参数传递,但我想知道为什么我看到这个限制?

切换回c风格的函数指针,

 typedef void (*MyCallback)(int, const char*, int, int, const char*, int);

似乎工作正常

最佳答案
此限制由Visual Studio中的实现设置.

std ::函数的C规范没有任何限制. std :: function使用可变模板来处理任意数量的参数.实现可能基于例如模板实例化嵌套限制而具有限制,但是它应该是大的.该规范建议1024作为一个良好的最小支持的嵌套深度,而256作为一个函数调用中允许的参数的一个很好的最小值.

Visual Studio(从VS11开始)没有可变模板.他们在VS11中模拟最多5个参数,尽管您可以将其更改为10个.通过在项目中定义_VARIADIC_MAX来实现.这可以大大增加编译次数.

更新:VS 2012 Nov CTP增加了对可变模板的支持,但标准库尚未更新以使用它们.一旦更新,您应该能够使用与std :: function一样多的参数.

转载注明原文:C 11 std ::函数是否限制函数指针可以拥有的参数数量? - 代码日志