繁体   English   中英

这是编写接受带有可变数量参数的函数指针的函数模板的正确方法吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM