比较不同大小的元组

4

为什么不能像这样比较不同大小的两个元组:

#include <tuple>
int main() {
  std::tuple<int, int> t1(1, 2);
  std::tuple<int> t2(1);
  if(std::tuple_size<decltype(t1)>::value == std::tuple_size<decltype(t2)>::value)
    return (t1 == t2);
  else
    return 0;
}

我知道t1==t2是不可能的。但在这个例子中,它不会被执行。有没有可能比较不同大小的元组?


问题不在于为什么不可能,而在于为什么你想这样做? - CinCout
你的意思是检查一个元组是否以另一个元组开头吗? - TartanLlama
我的问题是:你说的“不可能”是什么意思,有什么错误信息吗?抱歉,我只是懒得复制并自己查找。 - 463035818_is_not_a_number
3个回答

4

operator== 要求元组长度相等。

§ 20.4.2.7 [tuple.rel]:

template<class... TTypes, class... UTypes>
constexpr bool operator==(const tuple<TTypes...>& t, const tuple<UTypes...>& u);

1 Requires: For all i, where 0 <= i and i < sizeof...(TTypes), get<i>(t) == get<i>(u) is a valid expression returning a type that is convertible to bool. sizeof...(TTypes) == sizeof...(UTypes).

如果您希望将长度不同的两个元组视为不相等,则需要自行实现此逻辑:

template <typename... Ts, typename... Us>
auto compare(const std::tuple<Ts...>& t1, const std::tuple<Us...>& t2)
    -> typename std::enable_if<sizeof...(Ts) == sizeof...(Us), bool>::type
{
    return t1 == t2;
}

template <typename... Ts, typename... Us>
auto compare(const std::tuple<Ts...>& t1, const std::tuple<Us...>& t2)
    -> typename std::enable_if<sizeof...(Ts) != sizeof...(Us), bool>::type
{
    return false;
}

演示

这样,只有当元组的长度相同时才会实例化比较两个元组t1 == t2的代码。在您的情况下,编译器无法编译您的代码,因为没有预定义的operator==适用于此种情况。


1

您可以编写多个重载函数:

template<typename ...Ts>
bool is_equal(const std::tuple<Ts...>& lhs, const std::tuple<Ts...>& rhs)
{
    return lhs == rhs;
}

template<typename ...Ts, typename... Us>
bool is_equal(const std::tuple<Ts...>&, const std::tuple<Us...>&)
{
    return false;
}

实例演示


-1

我已经编辑了你的答案,使链接可用,但我认为这最好作为评论而不是答案发布,因为它本质上只是一个链接响应。 - enhzflep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接