C++ 从具有运行时索引的元组中选择一组值
简要介绍我的问题: 我正在尝试使用stl容器实现一种“排序”关系数据库。这只是出于娱乐/教育目的,因此不需要回答“使用此库”、“这绝对没用”等问题。 我知道标题在这一点上有点混乱,但我们将达到这一点(对标题的改进建议非常欢迎) 我迈着小步前进:C++ 从具有运行时索引的元组中选择一组值,c++,containers,c++17,C++,Containers,C++17,简要介绍我的问题: 我正在尝试使用stl容器实现一种“排序”关系数据库。这只是出于娱乐/教育目的,因此不需要回答“使用此库”、“这绝对没用”等问题。 我知道标题在这一点上有点混乱,但我们将达到这一点(对标题的改进建议非常欢迎) 我迈着小步前进: 我可以将表构建为从列名称到其值的映射向量=>std::vector。它很简单,代表了我的需要 等等,我可以只存储列的名称一次,然后用它们的索引访问值。=>标准::向量。与第1点一样简单,但速度更快 等等,在数据库中,表实际上是一个元组序列=>std::v
std::vector
。它很简单,代表了我的需要std::vector这是可行的,但很奇怪:
模板
constexpr std::variant helperTupleValueAt(const std::tuple&t,size\u t索引)
{
如果constexpr(候选者>=sizeof…(T)){
抛出std::logic_错误(“越界”);
}否则{
if(候选者==索引){
返回std::variant{std::in_place_index,std::get(t)};
}否则{
返回helperTupleValueAt(t,索引);
}
}
}
模板
std::variant-tupleValueAt(常量std::tuple&t,大小索引)
{
返回helperTupleValueAt(t,索引);
}
使用运行时索引访问tuple意味着tuple中的类型必须是统一的。如果它们是统一的,则不应使用tuple
,而应使用std::array
,因此使用运行时索引访问它不会有问题。其他不需要中继的解释需要具有运行时索引的元组。在所有情况下,您可能都有some_variant result=select(表,to_select)
@MarekR yes,是链接中文章的相同结果,统一类型为元组。我想你可以同意我的观点,那在数据库表中没有那么大用处。既然你将helperTupleValueAt
标记为constexpr
,那么tupleValueAt
的原因不是constexpr
?此外,巨大的+1。这很聪明。我只是忘记了。是的,它很奇怪,但很聪明,我喜欢它。无论如何,在这一点上,我认为我们必须使用variant
s绕过第一个问题,然后使用vector
作为select
方法的返回类型。必须改进代码以处理具有相同类型的多个字段的元组。我想知道是否有办法减少类型列表的唯一性,以便std::variant
更容易处理。@MarekR哦,对了,那太好了,但我不知道怎么做。我会接受你的答案,但对于我的项目,我会选择解决方案2,因为它对我来说更为一致(我可以选择并重新选择一个仍然是一个列较少的表的对象)。