- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
扩展灵活的函数参数,有一种使用std::initializer_list
的方法.然而我无法理解。任何人都可以以可以理解的方式解释这一点吗?
template<typename T, typename... Args>
auto print(T value, Args... args) {
std::cout << value << std::endl;
return std::initializer_list<T>{([&] {
std::cout << args << std::endl;
}(), value)...};
}
最佳答案
这是一种非常困惑的做事方式,但 C++14 要求我们做类似的事情。我将解释限制以及为什么以这种方式完成(尽管有更清晰的方法可以做到)。
此代码的目标是在单独的行上重复打印出它给出的每个参数。由于该函数是一个可变参数模板,它需要对表达式 std::cout << args << std::endl
使用包展开式.
您的第一个想法可能是 (std::cout << args << std::endl) ...;
.但是,这实际上不是您在 C++14 中可以做的有效事情。实际上,您只能在 C++14 中以逗号分隔的值序列的上下文中执行包扩展,例如函数的参数列表或其他任何内容。你不能只是将一个包扩展为一个赤裸裸的声明。
嗯,你可以将包扩展到一个地方是一个支撑初始化列表(用于初始化对象的 {}
)。然而,{(std::cout << args << std::endl) ...};
也不起作用。扩展没有任何问题;问题是支撑初始化列表本身。从语法上讲,braced-init-list 只能在初始化对象时出现。还有一个裸体{}
因为语句不初始化任何东西。所以你不能在那里使用它。
所以你必须使用 {}
初始化一些东西。典型的习惯用法是初始化一个空数组。例如:
int unused[] = {0, ((std::cout << args << std::endl), 0)...};
初始
0,
情况下需要
args
是空的;你不能初始化一个没有元素的无大小数组。尾随
, 0
在扩展表达式中是逗号表达式的一部分。
(1, 2)
意思是“计算表达式 1,然后丢弃它的值,计算表达式 2,并将其用作总表达式的结果。”所以在包扩展中使用它意味着`输出一个参数,丢弃结果,并使用 0 作为表达式的结果。因此,就表达式的结果而言,每个包扩展只是表示“0”的一种非常奇特的方式。
unused
只存储一堆零。我们使用
unused
初始化的副作用作为强制 C++ 解压缩包扩展的一种方式。
initializer_list<T>
.这也是有效的,它有一个小好处,就是在一个空的
args
上工作。 .问题是用户然后返回这个对象。这很糟糕,因为实际上没有人可以使用该返回值。
initializer_list
s 不拥有他们引用的对象。在保存这些对象的支撑初始化列表的引用处创建一个临时数组;
initializer_list
只是指向该数组。临时数组将在
return
结束时销毁语句,所以调用者会得到一个
initializer_list
指向一堆被破坏的对象。此外,它调用
T
的复制构造函数。很多次不必要的,因为没有人可以使用返回值。
return
并将其设为
void
功能。
((std::cout << args << std::endl), ...);
这是一个
fold expression在逗号运算符上。它将首先对
args
中的值调用每个子表达式。 .
关于c++ - Black Magic 使用 Initializer_list 和包扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63885413/
我正在尝试学习 React.JS,但有些事情让我大吃一惊。 我有这个标题组件: class Header extends Component { render() { return ;
我正在尝试学习 React.JS,但有些事情让我大吃一惊。 我有这个标题组件: class Header extends Component { render() { return ;
我有一个 Cordova iPhone 应用程序,它使用状态栏插件。状态栏的背景设置为黑色,而文本曾经是白色。但是自从插件从0.1.3版本升级到0.1.8之后,文字变成了黑色。 是否可以恢复旧行为,或
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Difference between Color.red and Color.RED 我看到 Java 类
基于poetry docs : Likewise if you have command line tools such as pytest or black youcan run them usin
我正在使用 Shadowbox.js example code显示带有消息“此站点仍在 build 中!”的阴影框在页面加载时: Shadowbox.init({ // let's sk
我注意到 eclipse 有一个奇怪的行为? 我有一个静态变量: public static colorID = R.color.Black; 有时它与 R.color.Black 匹配: if(co
我正在尝试通过运行Windows 7的笔记本电脑通过腻子将SSH连接到Beaglebone Black。 打开BBB的电源并在Windows上安装所需的BBB驱动程序后,我可以在Chrome浏览器中浏
我正在尝试评估颜色选择器选择的颜色的暗度,看它是否“太黑”,如果是,则将其设置为白色。我想我可以使用十六进制值的第一个字符来实现这一点。它在工作,但它也在切换一些合法的“浅色”颜色。 我有以下代码:
我无法弄清楚为什么下面的代码中有一个黑色矩形,据我所知,隐藏选项留下了一些东西,但我不知道如何隐藏它或更改它颜色。 这是什么以及我们如何操纵它? Select flow slides
我昨天买了 beaglebone black 并尝试使用 USB 连接它。正如我所读到的那样,它预装了运行在 192.168.7.2 的 Linux Distro,我们可以使用 ssh 访问它。但我无
我们目前正在为 BeagleBone Black 开发一个应用程序(使用标准的 Angstrom 发行版)。它在 GDB(由 Netbeans 远程控制)下运行了一段时间(5-10 分钟),但在某个相
Arial Black网路安全吗? 我已经读过它,但是当我将其放入字体声明中时,就得到了Times New Roman的支持。 有人知道为什么吗? 最佳答案 根据代码样式字体调查(实际上可能是最好的估
假设你有一个 red-black tree这是一个有效的 binary search tree并且不违反任何这些规则: 节点是红色或黑色。 根是黑色的。 所有叶子 (NIL) 都是黑色的。 每个红色节
我想在 Jenkins 共享库中实现黑色扫描仪。这个想法是,当库看到 pyproject.toml 时,它将执行黑色检查。该命令设置为 black --check ./ 。这将为所有项目设置一次,因此
我想在 3D 绘画工具上构建撤消/重做功能。每次绘制后我将纹理存储在一个数组中,如下所示: var image3 = mesh.material.map.image;
所以我有一个红黑树如下: 2 = Root Black Children = 1 (Black/Left), 4 (Red/Right) Children of 1 = NIL & NIL => He
我不太确定如何解决。所以我正在编程 blackJack 并且我有我的函数声明(如图所示),对于我的 add_card_to_hand 函数,我不知道该怎么做。我有 2 个参数,一手牌是我通过引用传递的
这个问题在这里已经有了答案: Disable Visual Studio 2015 extra debug option (5 个答案) 关闭 6 年前。 因此,每当我尝试在 Visual Stud
自动视差 AndEngine给出黑屏。 public class MainActivity extends SimpleBaseGameActivity { static final int
我是一名优秀的程序员,十分优秀!