我想从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] 删除。
我来说两句