我有一个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)) { ... }
答案 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::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;
}