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

Compare two tuples but only the first two args

我有一个 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

我该怎么做?

编辑 1:

两个元组的大小相同。我看到了两者如何与 std::tie() 进行 EQUAlITY 比较,但我可以写得更好:

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

编辑2:

另外,如果我想要这个怎么办:

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

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

以下代码在 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;
}

Also what if I want this:

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

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

给定一个元组对象模板可变索引列表,return 相应的子元组的函数呢?

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;