Szukam sposobu na porównanie dwóch krotek, aby sprawdzić, czy zawierają te same typy.
Kolejność typów nie ma znaczenia. Dopóki istnieje odwzorowanie jeden do jednego między typami dwóch krotek, uważam je za równoważne.Jak porównać krotki dla równoważnych typów bez względu na kolejność typów?
Oto mały test, który ustawiłem.
Mam problemy wykonawcze 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
}
Zastanawiam się, czy można użyć [this] (http://codereview.stackexchange.com/questions/131194/selection-sorting-a-type-list-compile-time), aby "posortować" typy krotek, a następnie możesz po prostu powtórzyć typy, aby upewnić się, że są tego samego typu. – NathanOliver
Innymi słowy, chcesz uzyskać kompilację 'is_permutation'. –