如何检查两个元组的所有成员是否都不相同?

jpo38

std::tuple<...>::operator!=如果两个比较元组中的至少一个成员不同,则返回true

如果两个比较元组的所有成员都不相同,我将需要一个返回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 areAllMembersDifferentC ++ 11中的任何一种实现都是可以接受的(无论是否使用我的首次尝试方法)。

贾罗德42

您可以使用以下内容:

namespace detail
{

template <std::size_t ... Is, typename Tuple>
bool areAllMembersDifferent(std::index_sequence<Is...>,
                            const Tuple& left,
                            const Tuple& right)
{
    bool res = true;

    const int dummy[] = {0, (res &= std::get<Is>(left) != std::get<Is>(right), 0)...};
    static_cast<void>(dummy); // Avoid warning for unused variable
    return res;
}

}

template <typename Tuple>
bool areAllMembersDifferent(const Tuple&left, const Tuple& right)
{
    return detail::areAllMembersDifferent(
        std::make_index_sequence<std::tuple_size<Tuple>::value>(), left, right);
}

演示版

std::make_index_sequence容易找到c ++ 11的实现(即C ++ 14)

在C ++ 17中,您甚至可以将helper函数简化为:

namespace detail
{

template <std::size_t ... Is, typename Tuple>
bool areAllMembersDifferent(std::index_sequence<Is...>,
                            const Tuple& left,
                            const Tuple& right)
{
    return (std::get<Is>(left) != std::get<Is>(right) && ...);
}

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何检查和删除python中两个不同目录中不相同的文件?

如何在R中生成随机整数,以使两个连续的数字都不相同

如何创建具有两个内部互不相同的内部imgclass项的表?

重新排列列表中的项目,以使相邻的两个项目都不相同

仅当两个列都不相同时才插入

是否可以在同一解决方案下创建两个基于服务总线队列而两个队列都不相同的Azure函数?

如何检查两个元组列表是否相同

如果两个单元格都不相同,是否可以使我的Excel单元格等于另一个单元格?

有没有一种方法可以随机排列数组,以使两个连续的值都不相同?

检查两个不同列中的值并替换不相同的值

在两个表中查找不相同的文本

为什么两个地块不相同

Java 8如何从两个集合中过滤不相同的实体?

R-如果顺序不相同,如何比较两个单词的句子?

如何连接两个不相同单词的字符串

如何在 SQL Server 中联接两个 ID 不相同的表?

改组字符串,使相邻的两个字母都不相同

检查元组中的两个元素是否具有相同的值

检查两个np数组内部是否具有相同的元组

如何检查数组的所有成员

如何检查两个流是否不相交?

列表的3位数字的所有可能组合永远都不相同

为什么我的启动类与所有示例都不相同?

无法从Selenium启动IE-所有区域的保护模式设置都不相同

在Visual Studio 2017中,所有括号和括号的大小都不相同

确保文本文件中的所有行的值都不相同

CSS模板在所有浏览器中都不相同(重叠div)

如何在MySQL中合并只有一个公共列而其他各不相同的两个表?

SQL查询2个表,在给定日期范围内两个表的值都不相同