[英]Is this the correct way to write a function template which accepts a function pointer with a variable number of arguments?
我有以下代码,
class ODBCFuncCall // Line 67
{
public:
ODBCFuncCall(SQLHANDLE stmt, SQLHANDLE conn) : m_stmt(stmt), m_conn(conn) {}
virtual ~ODBCFuncCall() {}
template <typename... A>
void RunStatementFunction(SQLRETURN (*in_func)(SQLHSTMT, A...), A... args)
{
in_func(m_stmt, args...);
}
virtual const char* GetFunctionName() = 0;
virtual void Setup() = 0;
virtual void Run() = 0;
virtual void Cleanup() = 0;
protected:
const SQLHANDLE m_stmt;
const SQLHANDLE m_conn;
};
我正在尝试使用VS2012 SP4进行编译。 它完全被否决了,这是我遇到的错误的一个示例:
Error 6 error C2059: syntax error : ')' \ODBCTask.h 75
Error 4 error C2065: 'A' : undeclared identifier \ODBCTask.h 75
Error 2 error C2065: 'in_func' : undeclared identifier \ODBCTask.h 75
Error 5 error C2143: syntax error : missing ')' before '...' \ODBCTask.h 75
Error 1 error C2143: syntax error : missing ',' before '...' \ODBCTask.h 74
Error 7 error C2238: unexpected token(s) preceding ';' \ODBCTask.h 80
Error 3 error C2275: 'SQLHSTMT' : illegal use of this type as an expression \ODBCTask.h 75
当我注释掉“ RunStatementFunction”时,它编译良好。 通过对类似内容的搜索可以发现语法对我来说是正确的...
是的,这是正确的: 请在ideone上对其进行操作 。
可变参数模板仅在使用2012年11月CTP时在VS 2012中可用。 那引入了一个单独的工具集,必须在项目属性中选择它。 它应该这样编译。
我看到两个问题。 First vs2012在实验性CTP之外不支持可变参数模板,不应在生产代码中使用
其次,您应该将参数完美地转发到函数指针。
template <typename... As,typename...Ts>
void RunStatementFunction(SQLRETURN (*in_func)(SQLHSTMT, As...), Ts&&... args)
{
in_func(m_stmt, std::forward<Ts>(args)...);
}
在优化的版本中,这应该消除辅助函数的所有开销。
vs2013支持可变参数模板。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.