C ++:找到满足谓词的元组的第一个元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:找到满足谓词的元组的第一个元素相关的知识,希望对你有一定的参考价值。

我有以下详细代码:

struct thing1 { int key, std::string value; };
struct thing2 { int key, std::string value; };
// ...
struct thingN { int key, std::string value; };

struct thing_map {
  thing1 t1;
  thing2 t2;
  // ...
  thingN tN;

  std::string get(int key) {
    if(t1.key == key) return t1.value;
    if(t2.key == key) return t2.value;
    // ...
    if(tN.key == key) return tN.value;
    throw std::runtime_error("bad key");
  }
};

我可以将things重构为std::tuple<thing1, thing2, /* ... */ thingN>,这允许我使用类型化的std::get访问它们,因此没有功能丢失(即std::get<thing1>(things))。我无法弄清楚如何实现if级联。有各种函数的实现,它们将函数应用于互联网上的每个元组元素,但这些函数总是使用索引参数包来进行映射,因此我不能选择单个元素并返回其值。琐碎的事情可能是将tN.value保存到捕获的变量并返回,但我觉得有更好的解决方案。

为清楚起见,我想要做的是:

struct thing_map {
  std::tuple<thing1, thing2, /* ... */ thingN> things;

  std::string get(int key) {
    foreach(auto&& thing : things) {
      if (key == thing.key) return thing.value;
    }
    throw std::runtime_error("bad key");
  }
};

我正在使用C ++ 17

答案

您可以使用C ++ 17,因此我建议使用std::apply()和模板折叠,如下所示

   std::string get(int key)
    {
      return std::apply([&](auto const & ... args)
       {
         std::string ret;

         ( ((key == args.key) ? (ret = args.value, true) : false)
           || ... || (throw std::runtime_error("bad key"), false) );

         return ret;
       }, things);
    }

以下是完整的编译示例

#include <tuple>
#include <string>
#include <iostream>
#include <stdexcept>

struct thing1 { int key{1}; std::string value{"one"}; };
struct thing2 { int key{2}; std::string value{"two"}; };
struct thing3 { int key{3}; std::string value{"three"}; };
struct thing4 { int key{4}; std::string value{"four"}; };

struct thing_map
 {
   std::tuple<thing1, thing2, thing3, thing4> things;

   std::string get(int key)
    {
      return std::apply([&](auto const & ... args)
       {
         std::string ret;

         ( ((key == args.key) ? (ret = args.value, true) : false)
           || ... || (throw std::runtime_error("bad key"), false) );

         return ret;
       }, things);
    }
 };

int main ()
 {
   thing_map tm;

   std::cout << tm.get(1) << std::endl;
   std::cout << tm.get(2) << std::endl;
   std::cout << tm.get(3) << std::endl;
   std::cout << tm.get(4) << std::endl;
   std::cout << tm.get(5) << std::endl;
 }

以上是关于C ++:找到满足谓词的元组的第一个元素的主要内容,如果未能解决你的问题,请参考以下文章

检查元组在某个位置的元素 - 快捷方式?

在 Seq 中找到满足条件 X 的第一个元素

c_cpp 找到数组中的第一个不同元素

c_cpp 找到整数数组中的第一个重复元素

如何优化 C 代码:寻找下一个设置位并找到相应数组元素的总和

限制 2 元组中元素的出现次数