比较两个元组,但只比较前两个参数
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::ignore
与 uint32_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;
我有一个 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::ignore
与 uint32_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;