我正在尝试创建一个函数,它将可变参数 lambda 工厂方法绑定到一个不带参数的函数。我不确定 VC 支持(使用 VS2012 和 2012 年 11 月的 CTP)是否不完全存在,或者(更有可能)我做错了。我对可变参数模板的工作不多,因此将不胜感激。
template <typename T, typename...Args>
std::function<T*()> MakeFactoryMethod(Args&&... args)
{
return std::bind([](Args&&... args2)
{
return new T(std::forward<Args>(args2)...);
},
std::forward<Args>(args)...);
}
...
auto test = MakeFactoryMethod<SomeClassWithSingleIntConstructor>(5);
我从编译器收到一长串错误。看起来 VC 标准库本身还没有使用可变参数模板。
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xrefwrap(431): error C2440: 'return' : cannot convert from 'std::_Do_call_ret<false,_Ret,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,std::tuple<int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>,std::tuple<std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>::type' to 'SomeClassWithSingleIntConstructor *'
1> with
1> [
1> _Ret=void
1> ]
1> Expressions of type void cannot be converted to other types
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(239) : see reference to function template instantiation '_Ret std::_Callable_obj<std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,_Ty,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>,false>::_ApplyX<_Rx>(void)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=int
1> , _Rx=SomeClassWithSingleIntConstructor *
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(239) : see reference to function template instantiation '_Ret std::_Callable_obj<std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,_Ty,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>,false>::_ApplyX<_Rx>(void)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=int
1> , _Rx=SomeClassWithSingleIntConstructor *
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(239) : while compiling class template member function 'SomeClassWithSingleIntConstructor std::_Func_impl<_MyWrapper,_Alloc,_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Do_call(void)'
1> with
1> [
1> _Alloc=std::allocator<std::_Func_class<SomeClassWithSingleIntConstructor *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>
1> , _Ret=SomeClassWithSingleIntConstructor *
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(514) : see reference to class template instantiation 'std::_Func_impl<_MyWrapper,_Alloc,_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' being compiled
1> with
1> [
1> _Alloc=std::allocator<std::_Func_class<SomeClassWithSingleIntConstructor *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>
1> , _Ret=SomeClassWithSingleIntConstructor *
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Alloc=std::allocator<std::_Func_class<SomeClassWithSingleIntConstructor *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>
1> , _Fty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Alloc=std::allocator<std::_Func_class<SomeClassWithSingleIntConstructor *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>
1> , _Fty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Fty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Alloc=std::allocator<std::_Func_class<SomeClassWithSingleIntConstructor *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Fty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Alloc=std::allocator<std::_Func_class<SomeClassWithSingleIntConstructor *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(675) : see reference to function template instantiation 'void std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Reset<_Ty>(_Fty &&)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Fty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(675) : see reference to function template instantiation 'void std::_Func_class<_Ret,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Reset<_Ty>(_Fty &&)' being compiled
1> with
1> [
1> _Ret=SomeClassWithSingleIntConstructor *
1> , _Ty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> , _Fty=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> c:\code\configurabletestserver\application.cpp(121) : see reference to function template instantiation 'std::function<SomeClassWithSingleIntConstructor *(void)>::function<std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,_Ty,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>(_Fx &&)' being compiled
1> with
1> [
1> _Ty=int
1> , _Fx=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> c:\code\configurabletestserver\application.cpp(121) : see reference to function template instantiation 'std::function<SomeClassWithSingleIntConstructor *(void)>::function<std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,_Ty,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>(_Fx &&)' being compiled
1> with
1> [
1> _Ty=int
1> , _Fx=std::_Bind<false,void,MakeFactoryMethod::<lambda_eabc5b7f0a2cea764c71ce16901cde81>,int,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> c:\code\configurabletestserver\application.cpp(139) : see reference to function template instantiation 'std::function<SomeClassWithSingleIntConstructor *(void)> MakeFactoryMethod<SomeClassWithSingleIntConstructor,int>(int &&)' being compiled
谢谢。