gpt4 book ai didi

c++ - 如何比较等效类型的元组而不考虑类型顺序?

转载 作者:可可西里 更新时间:2023-11-01 17:55:49 25 4
gpt4 key购买 nike

我正在寻找一种方法来比较两个元组,看看它们是否包含相同的类型。
类型的顺序无关紧要。只要两个元组的类型之间存在一对一的映射,我就会认为它们是等价的。

这是我设置的一个小测试。
我在执行 equivalent_types() 时遇到问题:

#include <iostream>
#include <utility>
#include <tuple>
#include <functional>

template <typename T, typename U>
bool equivalent_types(T t, U u){
return (std::tuple_size<T>::value == std::tuple_size<U>::value);
//&& same types regardless of order
}


int main() {

//these tuples have the same size and hold the same types.
//regardless of the type order, I consider them equivalent.
std::tuple<int,float,char,std::string> a;
std::tuple<std::string,char,int,float> b;

std::cout << equivalent_types(a,b) << '\n'; //should be true
std::cout << equivalent_types(b,a) << '\n'; //should be true

//examples that do not work:

//missing a type (not enough types)
std::tuple<std::string,char,int> c;

//duplicate type (too many types)
std::tuple<std::string,char,int,float,float> d;

//wrong type
std::tuple<bool,char,int,float> e;

std::cout << equivalent_types(a,c) << '\n'; //should be false
std::cout << equivalent_types(a,d) << '\n'; //should be false
std::cout << equivalent_types(a,e) << '\n'; //should be false
}

最佳答案

通过计算两个元组的类型,您可以执行如下操作:

template <typename T, typename Tuple>
struct type_counter;

template <typename T, typename ... Ts>
struct type_counter<T, std::tuple<Ts...>> :
std::integral_constant<std::size_t, (... + std::is_same<T, Ts>::value)> {};

template <typename Tuple1, typename Tuple2, std::size_t... Is>
constexpr bool equivalent_types(const Tuple1&, const Tuple2&, std::index_sequence<Is...>)
{
return (...
&& (type_counter<std::tuple_element_t<Is, Tuple1>, Tuple1>::value
== type_counter<std::tuple_element_t<Is, Tuple1>, Tuple2>::value));
}

template <typename Tuple1, typename Tuple2>
constexpr bool equivalent_types(const Tuple1& t1, const Tuple2& t2)
{
constexpr auto s1 = std::tuple_size<Tuple1>::value;
constexpr auto s2 = std::tuple_size<Tuple2>::value;

return s1 == s2
&& equivalent_types(t1, t2, std::make_index_sequence<std::min(s1, s2)>());
}

Demo C++17
Demo C++14

我使用 c++17 来折叠表达式,但它可以很容易地重写为 constexpr 函数。

关于c++ - 如何比较等效类型的元组而不考虑类型顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40117987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com