获取C ++可变参数模板参数的序数

猫王Oric

我想从variadic template参数中检索每个参数的索引,目前我正在使用这种方法:

从第三方库:

struct statement {
  template <typename T>
  void bind(int, T t) { // ....
  }
};

我的代码:

template <unsigned Index, typename T>
void bind(statement& stmt, T t) {
    stmt.bind(Index, t);
}

template <unsigned Index, typename T, typename... Args>
void bind(statement& stmt, T t, Args... args) {
  bind<Index>(stmt, t);
  bind<Index + 1>(stmt,args...);
}
template <typename... Args>
void bind_all(statement& stmt, Args... args) {
  constexpr int Index = 0;
  bind<Index>(stmt, args...);
}

用法:

statement stmt;
prepare(stmt, "insert into tab (a,b,c,d,e,f) values(?,?,?,?,?,?)");
bind_all(stmt, 1,1.24f, 3.14, "Hello", std::string{"World"}, true);

我的问题:是否有更好的方法来实现此目的,以获得有序的variadic template参数?

编辑:我想使用此实现来包装sql prepared statement并将特定的参数绑定到特定的索引。这是我要包装的代码示例,而不是单独列出每个绑定,而是要调用bind_all

    prepare(stmt, "insert into tab (a, b) values (?, ?);");
    const int eight_int = 8;
    stmt.bind(0, &eight_int);
    const string eight_str = "eight";
    stmt.bind(1, eight_str.c_str());
    execute(stmt);
安迪

通过简单的扩展(可以在C ++ 17中使用fold表达式

struct statement
{
    template<class T>
    void bind(int index, T&& arg)
    {
       // magic
    }
};

template<class... Args>
void BindAll(statement& stmt, Args&&... args)
{
    using swallow = int[];
    int idx = 0;
    (void)swallow{0, (void (stmt.bind(idx++, std::forward<Args>(args))), 0)...};
}

我对API有所保留,但我认为它与您的代码的映射足够接近。

用法:

statement stmt;
BindAll(stmt, 1, 1.2, 1.3f, true, "abc");

演示版

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章