当前位置: 首页 > 知识库问答 >
问题:

在C 17/20中对元组进行迭代[重复]

邓星光
2023-03-14

有人知道在C 17/20中迭代元组的好的、干净的方法吗?假设我们有这样的代码:

class Test
{
    public:
        Test( int x ) : x_(x) {};
        void Go() const { std::cout << "Hi!" << x_ << "\n" ; }
        int x_;
};
int main()
{
    std::tuple tplb{ Test{1} , Test{2} ,  Test{3} };
}

我们如何迭代元组并使用最新的17/20特性在每个元组上调用Go()方法?

我知道你可以有一个物体的向量,然后它就很容易工作了。我的目标是能够在不使用虚拟函数的情况下实现某种多态性。

其想法是能够在元组中有支持相同方法的其他对象类型。如果该方法存在于每个对象中,那么代码将编译和执行,而不必使用基类、virtuals、vtable等。

使用std::applystd::invoke是否有某种方法?

共有2个答案

田翔
2023-03-14

访问元组的每个成员需要一点std::index_序列技巧。

#include <iostream>
#include <tuple>
#include <utility>

class Test
{
    public:
        Test( int x ) : x_(x) {}; 
        void Go() const { std::cout << "Hi!" << x_ << "\n" ; } 
        int x_; 
};



template<typename F, typename T, std::size_t... Index>
void doStuffIndex(F&& action, T const& tup, std::index_sequence<Index...> const&)
{
    bool ignore[] = {((std::get<Index>(tup).*action)(), true)...};
}

template<typename F, typename... Obj>
void doStuff(F&& action, std::tuple<Obj...> const& tup)
{
    doStuffIndex(action, tup, std::make_index_sequence<sizeof...(Obj)>());
}

int main()
{
    std::tuple<Test, Test, Test> tplb{ Test{1} , Test{2} ,  Test{3} };
    doStuff(&Test::Go, tplb);
}

姚星腾
2023-03-14

使用std::applystd::invoke是否有某种方法?

std::apply使用折叠表达式满足需要:

std::tuple tplb{ Test{1} , Test{2} ,  Test{3} };

std::apply([](const auto&... tests){(tests.Go(), ...);}, tplb);

这里,我们为元组的每个类型值调用方法Go()

其想法是能够在元组中有支持相同方法的其他对象类型。如果该方法存在于每个对象中,那么代码将编译和执行,而不必使用基类、virtuals、vtable等。

所以上述方法是有效的。如果您想更进一步,并根据类型分配到不同的实现,您可以使用std::visit示例中的重载类:

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

auto f = overloaded {
        [](const Test& test) { test.Go(); },
        [](double d) { std::cout << d << ' '; },
        [](const std::string& s) { std::cout << s << ' '; },
    };
std::apply([&](const auto&... e){ (f(e), ...);}, my_tuple);
 类似资料:
  • 主要内容:JavaTuples 元组迭代的介绍,JavaTuples 元组迭代的示例JavaTuples 元组迭代的介绍 每个元组都实现了 Iterable 接口,并且可以以与集合类似的方式进行迭代。 JavaTuples 元组迭代的示例 在这里,我们将看到如何迭代元组。 输出结果为:

  • 标题有点混乱,很抱歉,所以我有一个太多的数组,其中一个数组比第二个数组包含更多 所以我想做的是例如 这只会注销第一个一次,但我想要的是日志y和x长度一样多,希望这是足够清楚的

  • 我在中有一个带有几个元素的,我正在做的是迭代并显示Array中与null不同的所有元素。 这是: 我的问题:是否可以在一行中迭代null以外的元素?

  • 我有包含在DataFrame中的链接行。 我的逻辑如下

  • 问题内容: 我收到一个迭代器作为参数,并且想对值进行两次迭代。 可能吗 ?怎么样 ?签名是由我使用的框架(即Hadoop)强加的。 -编辑- 最后,该方法的真正签名是一个。我被这个Wiki页面所迷住了(实际上这是我发现的唯一不被弃用(但错误的)单词计数示例)。 问题答案: 如果要再次迭代,我们必须缓存来自迭代器的值。至少我们可以将第一次迭代和缓存结合起来: (只需要添加代码答案,就知道您在自己的注

  • 问题内容: 我正在尝试编写一个非常基本的最近邻居计算。我基本上想看看t是什么样子,但出现此类型错误。当我要求功能返回时,它说“”。当我要求它列出来时,抛出“ TypeError:在0维数组Python上进行迭代” 我该如何解决? 完整跟踪: 问题答案: 问题是不带迭代器,需要先转换为,如下所示: 根据 文档,必需的参数必须是: 数组,任何公开数组接口的对象,其数组方法返回数组的对象或任何(嵌套)序