【发布时间】:2022-02-28 06:38:51
【问题描述】:
Compiler Explorer Demonstration 显示了我发现的有效内容,以及一个注释掉的部分,显示了我想要的内容,但这不起作用。
我是 C++ 新手,我正在尝试用 C++20 编写一个 sqlite3 接口,该接口对查询参数和返回的列类型进行类型检查。我已经被困了好几天了,读了这么多。我确信其中一个有我的答案,但我只是不太了解这些东西,无法弄清楚我的问题是什么:
- Variadic template constructor with multiple parameters packs
- template template variadic parameter pack
- C++ variadic template return type
- How can I have multiple parameter packs in a variadic template?
- Unpacking a typelist
最终,这就是我想要的工作
template <class... T>
struct Typelist {};
struct Database {
Database(const string &sql) {}
template <class Input, class Output>
void Query(Input input) {}
// error: non-class, non-variable partial specialization
// 'Query<Typelist<Inputs ...>, Typelist<Outputs ...> >' is not allowed
template <class... Inputs, class... Outputs>
vector<tuple<Outputs...>> Query<Typelist<Inputs...>, Typelist<Outputs...>>(
const string &sql, Inputs... inputs) {}
};
int main() {
Database db(":memory:");
vector<tuple<string, string>> people =
db.Query<Typelist<int, float>, Typelist<string, string>>(
"SELECT fname, lname FROM users WHERE id = ? AND somefloat = ?;", 1, 42.0f);
}
任何意见将不胜感激。
【问题讨论】:
-
请将您的代码作为文本添加到问题中。你遇到的具体问题是什么?您是否在问如何遍历两个列表中的所有类型?还可以考虑使用现有的包装器,例如sqlite++.
-
@HolyBlackCat 更新了更完整的示例。 Compiler Explorer 链接也有一些紧密的工作解决方案,但不是我想要的。我遇到的确切问题是我想要的界面无法编译。我可以使用折叠表达式遍历所有类型并使用
index_sequence来获取相对位置。这是一个学习练习,因此包装器会适得其反。谢谢。 -
我明白了。由于不允许部分特化函数,因此您需要一个包含静态函数的辅助模板类(您将要对其进行部分特化)。将所有逻辑移至该辅助函数,并从现有函数中调用它。
-
“我是 C++ 新手,我正在尝试用 C++20 编写一个 sqlite3 接口” 标记为“可变参数模板”和“元编程”... ?? ??好吧,这迅速升级。也许从简单开始? ??????
-
我不明白这应该如何工作。您是否尝试执行类似
std::format的操作,但对于 sql 查询?基本上,你写的是类型安全的sqlite_exec_printf吗?我不明白你为什么需要Typelist<int, float>你已经有了类型,1是一个int,42.0f是一个浮点数,不需要指定它们。因为这是一个很好的理论例子,但它可能是你在问 XY 问题。
标签: c++ metaprogramming variadic-templates template-meta-programming partial-specialization