比较两个元组,但仅比较前两个参数

时间:2019-01-30 12:43:14

标签: c++ std c++17 stdtuple

我有一个std::tuple,例如

std::tuple<uint16_t, uint16_t, uint32_t> key{};
std::tuple<uint16_t, uint16_t, uint32_t> key2{};
const auto [k, p, r] = key;

,我想与第二个元组进行比较,但仅比较前两个参数。像这样:

if(std::tie(k, p, std::ignore) < std::tie(key)) { ... }

如果以这种方式执行此操作,则会出现以下错误:

error C2338: cannot compare tuples of different sizes

我该怎么做?

EDIT1:

两个元组具有相同的大小。我看到两个如何在std::tie()的EQUALITY上进行比较,但是我可以写得更好:

if(std::tie(k, p, std::ignore) == std::tie(key)) { ... }

EDIT2:

如果我想要这个怎么办:

if(std::tie(k, std::ignore, p) == std::tie(key)) { ... }

2 个答案:

答案 0 :(得分:2)

  

如果我想要这个怎么办:

     

if(std::tie(k, std::ignore, p) == std::tie(key)) { ... }

所以您想将子元组与原始元组的某些元素进行比较?不一定是前两个要素?

给定元组对象一个模板可变参量索引列表,然后返回相应的子元组的函数呢?

template <std::size_t ... Is, typename T>
auto getSubTuple (T const & t)
 { return std::tie(std::get<Is>(t)...); }

所以你可以写

   std::tuple<std::uint16_t, std::uint16_t, std::uint32_t> key{0, 1, 2};
   std::tuple<std::uint16_t, std::uint16_t, std::uint32_t> key2{0, 3, 2};

   std::cout << (getSubTuple<0u, 2u>(key) == getSubTuple<0u, 2u>(key2)) << std::endl;

答案 1 :(得分:0)

在您的示例中,您正在比较大小为3(std::tie(k, p, std::ignore))的元组和大小为1(std::tie(key)类型的大小为std::tuple<std::tuple<uint16_t, uint16_t, uint32_t>>的元组。您不应该在元组上打领带,因为它会创建一个包含单个项目的元组。

以下代码在GCC 8.2.1上也失败,因为编译器不知道如何处理std::ignoreuint32_t的比较。在这种情况下,我将为此类型(std::tuple<std::tuple<uint16_t, uint16_t, uint32_t>>)写一个专门的比较函数。

#include<tuple>

int main() {
    uint16_t k = 0;
    uint16_t p = 0;
    std::tuple<uint16_t, uint16_t, uint32_t> key{};
    if(std::tie(k, p, std::ignore) < key) {
        // TODO
    }
    return 0;
}