std::tuple<...>::operator!=
возвращает true, если не менее один член двух сравниваемых кортежей отличается.Как проверить, не отличаются ли все члены двух кортежей?
я должен был бы функцию, которая возвращает истину, если все члены двух сравниваемых наборов различны:
template <class... Args>
bool areAllMembersDifferent(const std::tuple<Args...>& left, const std::tuple<Args...>& right)
{
bool allDiff = true;
// iterate through the tuples are set allDiff to false if one member's is different than other's
return allDiff;
}
Вдохновленный из того, что я нашел в Интернете, я написал (адаптировано функцию, которая была печать содержание кортежа):
template <std::size_t N, std::size_t, class = make_index_sequence<N>>
struct CheckTupleLoop;
template <std::size_t N, std::size_t J, std::size_t... Is>
struct CheckTupleLoop<N, J, index_sequence<Is...>> {
template <class Tup>
int operator()(bool& allDiff, const Tup &left,const Tup &right) {
if (std::get<J>(left) == std::get<J>(right))
allDiff = false;
return 0;
}
};
template <class... Args>
bool areAllMembersDifferent(const std::tuple<Args...>& left, const std::tuple<Args...>& right)
{
bool allDiff = true;
CheckTupleLoop<sizeof...(Args)>{}(allDiff,left,right);
return allDiff;
}
Но это, очевидно, не корректно, так как компилятор сообщает мне Error C2955 'CheckTupleLoop': use of class template requires template argument list
Любой вид реализации bool areAllMembersDifferent
в C++ 11 был бы приемлемым (с использованием или не с моей первой попытки).
ли вы имеете в виду, чтобы проверить содержание двух кортежи? Я запутался в *, вернул бы true, если все члены ** ** кортежа отличаются друг от друга * – Jonas
@Jonas: Проверьте, не отличаются ли все члены двух кортежей. Отредактировано сообщение. – jpo38
Boost.Hana имеет функцию «disjoint», которая проверяет, имеют ли кортежи общие элементы. – TemplateRex