C++ 从具有运行时索引的元组中选择一组值

C++ 从具有运行时索引的元组中选择一组值,c++,containers,c++17,C++,Containers,C++17,简要介绍我的问题: 我正在尝试使用stl容器实现一种“排序”关系数据库。这只是出于娱乐/教育目的,因此不需要回答“使用此库”、“这绝对没用”等问题。 我知道标题在这一点上有点混乱,但我们将达到这一点(对标题的改进建议非常欢迎) 我迈着小步前进: 我可以将表构建为从列名称到其值的映射向量=>std::vector。它很简单,代表了我的需要 等等,我可以只存储列的名称一次,然后用它们的索引访问值。=>标准::向量。与第1点一样简单,但速度更快 等等,在数据库中,表实际上是一个元组序列=>std::v

简要介绍我的问题: 我正在尝试使用stl容器实现一种“排序”关系数据库。这只是出于娱乐/教育目的,因此不需要回答“使用此库”、“这绝对没用”等问题。 我知道标题在这一点上有点混乱,但我们将达到这一点(对标题的改进建议非常欢迎)

我迈着小步前进:

  • 我可以将表构建为从列名称到其值的映射向量=>
    std::vector
    。它很简单,代表了我的需要
  • 等等,我可以只存储列的名称一次,然后用它们的索引访问值。=><代码>标准::向量。与第1点一样简单,但速度更快

  • 等等,在数据库中,表实际上是一个元组序列=>
    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,因为它对我来说更为一致(我可以选择并重新选择一个仍然是一个列较少的表的对象)。