问题标签 [fold-expression]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将函数应用于向量元组以获取元素元组(可变参数模板)
我有一个容器类,它接受一个vector
或array
对象列表(并存储对原始对象列表的引用元组)。现在,当通过调用容器时,operator()(size_t idx)
我希望函数返回一个元组,其中包含idx
每个向量/数组索引处的元素。
例如,z(2)
上面应该等于std::tuple<int, std::string, double>(12, "ABC", 99.3)
。我将如何实现这一目标?
c++ - c ++折叠表达式与用户定义的类
我想做一个带有多个参数的日志函数,我也想用我的类调用日志函数。
这是我的代码(编译器:Visual Studio 2019 或 x86-64 gcc9.2)
问题 1> 我无法理解日志功能。是否可以像这样使用折叠表达式?(此函数来自 spdlog 库)
问题 2> 如何在 Mystruct 类中使用日志功能?
log(1, MyStruct(1, 1.1f, "hello world"s)); // compiler error
c++ - 非递归访问自定义变体 - 如何优雅地返回值?
我正在std::variant
为个人项目和学习体验编写一个准系统版本。我要实现的访问策略是一个if...else if
链,而不是一个constexpr
函数指针表。原因是后者对于编译器来说是出了名的难以优化,而且很容易产生一个std::visit
被if...else if
.
我正在尝试使用折叠表达式来实现它,但是当找到正确的访问者时,我找不到返回值的方法。这是我到目前为止所拥有的:
我目前的策略是为变体中的所有类型创建一个std::index_sequence
,然后折叠逗号运算符以使编译器生成一堆if
语句。由于if
不是一个表达式,我不得不将它包装成一个lambda 表达式以便能够折叠它。如果我尝试返回,我将从 lambda 本身返回,并且不会传播到上层。
我可以使用缓冲区来存储结果,然后返回它,但这违背了目的,因为它会阻止 RVO。
有没有一种方法可以非递归地编写match
并且仍然返回访问者的结果允许 RVO 发生?
c++ - C ++如何遍历可变参数模板类型并将它们添加到元组?
这个比较复杂,所以我自己无法解决。
下面是相关代码,后面我会更深入的解释。
最终,我的愿望是返回模板类型元组的向量。这里实际上有两个相关的问题。
- 我需要传递所有类型而不是折叠,因为参数元组需要在每次递归调用时知道所有类型
- std::get/std::tuple_element 需要一个 constexpr 索引参数,所以我不能遍历元组类型。
c++ - 如何使用折叠表达式扩展为初始化列表?
我想在向量中插入与可变参数模板函数的参数一样多的零(即向量中的参数数量为零)。我正在尝试使用折叠表达式来实现这一点,并且在使用(vec.push_back(zeroHelper(args)), ...);
.
我不明白的是:为什么当我尝试通过“展开”到初始化器列表中直接初始化向量时它不起作用,如下所示:
std::vector<int> vec = { (zeroHelper(args), ...) };
?
完整源代码:
预期输出:
0
0
0
0
使用初始化列表方法输出:
0
为什么?
c++ - 迭代 C++ 中的类继承
假设我有一些类架构(类的数量在开发过程中不断增加),每个类都继承自 N 个具有相同基本接口的类。创建将迭代继承的基函数(在基类或派生类中)的最佳方法是什么(如果可能)?
目标:避免开发人员的错误,确保我们不会忘记从所有继承中调用所有基本函数,并使代码更清晰易读和易于理解。
请参阅更新状态的编辑说明
简短的例子:
更具描述性和实用性的示例:
一些事情要知道:
- 我正在使用 Linux 64x 平台(Ubuntu 16.04)——如果答案很重要的话。
- 这段代码背后的想法是创建一种易于扩展和理解的 Decorator DP,并使开发人员能够使用
protected
基类的功能/属性。
一个实际的例子(供我实际使用)可以在这个 commit中找到。
编辑:
感谢@RaymondChen,我得到了一个可行的解决方案,(到目前为止)只有一个小问题:每次我想使用以这种方式实现的类时,我都需要core_base
在它的模板参数列表中指定该类(之前-我正在使用默认类型参数)。我正在寻找解决此问题的方法。
目前的解决方案:
创建实例示例:
当前:
std::shared_ptr<base> base = std::make_shared<core_2<core_1<base_core>, core_3<base_core>>>();
期望:在此提交中可以找到
std::shared_ptr<base> base = std::make_shared<core_2<core_1<>, core_3<>>>();
一个实际示例(供我实际使用) 。
c++ - C++ 编译器如何在 C++17 中实现折叠表达式?
我环顾网络以了解这些高度简单易用的表达式是如何在幕后实现的,但我找不到与这些表达式的实现相关的任何内容。
例如:
或者:
我只在 C++11 和 C++14 中找到了递归方式,但我找不到任何关于编译器理解这些表达式的智能方式。
我将尝试更好地解释我的问题:
在将折叠表达式编译为汇编之前,编译器是否将折叠表达式转换为更简单的 C++ 代码(如果是,它是递归发生还是在常规循环中发生)?
询问将可变参数表达式编译成汇编的一般方法可能会更好,但在 C++11/C++14 中,它比 C++17 中的折叠表达式更接近 C 语法。用低级语言实现它看起来并不简单。
要更多地关注这个问题——如果可能的话,并且您知道具有此功能(折叠表达式)的开源编译器,请将您的答案参考这个编译器(尽管如果存在,我会寻找更一般的答案)。
c++ - lambda 折叠表达式获取索引
有没有一种简单的方法可以将 As 的当前添加到index
包含arg
它的 lambda 调用中,所以我不需要使用index++
c++ - 将折叠表达式传递给可变参数模板
考虑以下使用折叠表达式打印参数的函数。
考虑调用它的第二个函数:
在我的用例中,我需要这样调用print
(使用折叠表达式)
在这种情况下,调用看起来像这样
但是该函数似乎只捕获了最后一个参数,就好像我这样称呼它:
任何帮助,将不胜感激
编辑:我实际上想要完成的事情
c++ - C++17折叠语法测试向量组合
标准 C++17 实现 vector any
, all
:
用法如
是否有一种类似的方式来定义only
,当且仅当向量的唯一值集与输入值匹配时才返回 true?所以以下断言将成立