【问题标题】:Compare two tuples but only the first two args比较两个元组,但只比较前两个参数
【发布时间】:2019-01-30 12:43:14
【问题描述】:

我有一个std::tuple,例如

std::tuple<uint16_t, uint16_t, uint32_t> key{};
std::tuple<uint16_t, uint16_t, uint32_t> key2{};
const auto [k, p, r] = key;

我想与第二个元组进行比较,但只与前两个参数进行比较。类似的东西:

if(std::tie(k, p, std::ignore) < std::tie(key)) { ... }

如果我这样做,我会收到以下错误:

error C2338: cannot compare tuples of different sizes

我该怎么做?

EDIT1:

两个元组的大小相同。我看到两个在 EQUAlITY 上与std::tie() 的比较,但我可以写得更好:

if(std::tie(k, p, std::ignore) == std::tie(key)) { ... }

EDIT2:

如果我想要这个怎么办:

if(std::tie(k, std::ignore, p) == std::tie(key)) { ... }

【问题讨论】:

标签: c++ std c++17 stdtuple


【解决方案1】:

如果我想要这个怎么办:

if(std::tie(k, std::ignore, p) == std::tie(key)) { ... }

所以您想将子元组与原始元组的某些元素进行比较?不一定是前两个元素?

如果给一个元组对象一个模板可变索引列表,返回相应的子元组的函数呢?

template <std::size_t ... Is, typename T>
auto getSubTuple (T const & t)
 { return std::tie(std::get<Is>(t)...); }

所以你可以写

   std::tuple<std::uint16_t, std::uint16_t, std::uint32_t> key{0, 1, 2};
   std::tuple<std::uint16_t, std::uint16_t, std::uint32_t> key2{0, 3, 2};
    
   std::cout << (getSubTuple<0u, 2u>(key) == getSubTuple<0u, 2u>(key2)) << std::endl;

【讨论】:

    【解决方案2】:

    在您的示例中,您将大小为 3 的元组 (std::tie(k, p, std::ignore)) 与大小为 1 的元组 (std::tie(key),其类型为 std::tuple&lt;std::tuple&lt;uint16_t, uint16_t, uint32_t&gt;&gt;) 进行比较。您不应该在元组上调用 tie,因为它会创建一个包含单个项目的元组。

    以下代码在 GCC 8.2.1 中也会失败,因为编译器不知道如何处理 std::ignoreuint32_t 的比较。在这种情况下,我将为这种类型编写一个专门的比较函数 (std::tuple&lt;std::tuple&lt;uint16_t, uint16_t, uint32_t&gt;&gt;)。

    #include<tuple>
    
    int main() {
        uint16_t k = 0;
        uint16_t p = 0;
        std::tuple<uint16_t, uint16_t, uint32_t> key{};
        if(std::tie(k, p, std::ignore) < key) {
            // TODO
        }
        return 0;
    }
    

    【讨论】:

    • 你是对的,我应该说自定义比较函数(不是运算符)。
    • 不知道是不是喜欢比较功能。我个人更喜欢子元组方法,但您的想法是在某些情况下可能有意义的有效选项。但是,在当前状态下,您的帖子几乎没有答案。您可以通过展示函数的实现来改进它。
    • Simon Doppler:那是你说我比较不同大小的元组是解决问题的一个例子。我来这里的原因是我想比较大小相同但忽略args的元组。
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2017-09-01
    • 2010-12-11
    • 2012-12-26
    • 2021-03-21
    相关资源
    最近更新 更多