我必须以相同的方式调用不同的函数:
VixHandle jobHandle = VIX_INVALID_HANDLE;
jobHandle = VixHost_Connect(VIX_API_VERSION, provider, host.c_str(), 0, user.c_str(), password.c_str(), 0, VIX_INVALID_HANDLE,NULL, NULL);
VixHandle result = Vix_waitJobResult(jobHandle);
我想简化源代码,并使用如下代码:
template <typename FUNC, typename ... ARGS>
VixHandle VIX_CALL(FUNC fun, ARGS ... arg){
VixHandle result = VIX_INVALID_HANDLE;
VixHandle jobHandle = VIX_INVALID_HANDLE;
jobHandle = fun(arg...);
result = Vix_waitJobResult(jobHandle);
Vix_ReleaseHandle(jobHandle);
return result;
}
并使呼叫看起来像:
VixHandle hostHandle = VIX_CALL(VixHost_Connect, VIX_API_VERSION, provider, host.c_str(), 0, user.c_str(), password.c_str(), 0, VIX_INVALID_HANDLE,NULL, NULL);
显然,我的模板不起作用,而且我不确定如何修复它:
C:\Users\crashtua\Documents\CppVix\vix_api_helper.h:12: error: C2664: 'VixHandle (int,VixServiceProvider,const char *,int,const char *,const char *,VixHostOptions,VixHandle,VixEventProc (__cdecl *),void *)': cannot convert argument 10 from 'int' to 'void *'
最后,如何修复(或重写)我的模板以使其按预期工作?
我猜编译器会解释NULL
为int
(请参阅此问题,或者更好的是,Scott Meyer的《Effective Modern C ++》)。您知道意图是一个指针,但是编译器不是。您应该使用nullptr
。
在下面的示例中,请参见make_vix_2
的呼叫:
#include <utility>
class vix_handle{};
template<class Fn, typename ...Args>
void vix_call(Fn fn, Args &&...args)
{
vix_handle job_handle = fn(std::forward<Args>(args)...);
}
vix_handle make_vix_0(int, int, int){return vix_handle();}
vix_handle make_vix_1(float){return vix_handle();}
vix_handle make_vix_2(char *){return vix_handle();}
int main()
{
vix_call(make_vix_0, 1, 2, 3);
vix_call(make_vix_1, 1.0);
vix_call(make_vix_2, nullptr);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句