- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的(模板化)函数:
template<typename T>
void func(std::initializer_list<std::vector<T>> args)
{
for (const auto &values : inputValues)
{
someOperation(values);
}
}
但我很确定这不是我想要的。我想要的是一个可以接收任意数量的 std:vector<T>
的函数避免复制(事实上,它们应该被接收为const
,因为我没有在里面修改它们)。理想情况下,我希望能够传递右值和左值,例如:
std::vector<int> myVec {1, 2, 3};
func({myVec, {4, 5}});
我对当前声明的问题是,我认为(尽管我没有找到任何明确证实或反驳这一点的来源),就像现在一样,初始化列表将复制创建时的 vector (我知道在任何情况下复制初始化列表本身时它们都不会被复制);它是否正确?如果是这样的话,就是:
template<typename T>
void func(std::initializer_list<const & std::vector<T>> args)
{
// ...
}
我在寻找什么?这允许我使用右值吗?我对与初始值设定项列表不同的选项持开放态度(我不确定是否能够使用可变参数模板,因为此函数模板是显式实例化并编译到库中的,但如果有替代方案,那会很有趣看看)。
最佳答案
您不需要 initializer_list
因为如果您尝试初始化其他vector
,它将强制进行复制与它同在。相反,您希望使用可变参数模板转发引用:
template<class... T>
bool func(T&&... vectors);
然后你就可以std::forward<T>(vectors)...
如您认为合适。
这可以让您趁机避免复制。
例如
std::vector<int> a;
std::vector<int> b;
std::vector<int> c;
// initialize a, b, and c
func(std::move(a), std::move(b), std::move(c));
如果您想强制 const ref 接收所有 vector ,请尝试以下操作:
template<class... Vec>
bool func(const Vec&... vectors);
//...
func(a, b, c); // pass all by const ref
安initializer_list
在许多情况下,这是一个糟糕的选择,不仅因为构造时复制问题,还因为它引用了具有本地范围的元素数组。这里的含义是,如果您想要复制 return 它,您最终会得到静默的未定义行为(如果您意外禁用 RVO,或者编译器没有实现 RVO 或对 initializer_list
不正确地实现它,您'又不走运了)
重新编辑:
I am not actually using the initializer list to initialize anything, I just use it as a lightweight arguments container and, iterating its values and read the values in the vectors (I'll update the question to make that clearer). Would this also cause the creation of copies?
不,不需要创建任何拷贝。使用 initializer_list
没有问题本质上就是这样,但这不是它的预期用途。它的预期用途是让类构造函数具有 initializer_list
构造函数。如果您正在寻找一个可以迭代的容器,那么创建一个引用其他 vector 的 vector 没有什么坏处(std::vector<const std::vector<int>&>
)
关于c++ - 重物体的initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45101756/
大家好,本文实现了相机碰撞检测,使相机不穿墙壁、物体,并给出了思路和代码,感谢大家~ 关键词:数字孪生、three.js、Web3D、WebGL、相机碰撞、游戏相机 我正在承接Web3D数字孪生项
我有一个大小为 12*30 的字符串的图像。我想创建一个动画,让它给人一种拉伸(stretch)字符串的感觉。我通过缩放图像来做到这一点,但我面临的问题是缩放图像没有发生碰撞。它仅出现在原始图像大小的
我的对象列表是如此初始化: $( function() { var $container = $('div.hikashop_products'); $container.isotop
我听说 swing 默认情况下是双缓冲的。我不想让 Swing 双缓冲。我正在使用双缓冲,我想添加一些 Swing 对象(现在只是添加到 JPanel 中的 JButton,然后再添加到 JFrame
几天来我一直在思考最好的解决方案,但似乎无法找到正确的想法。 我有一 block (物体),我想将它们放入尽可能小的空间中。我最终寻找的是这样的东西 http://i.stack.imgur.com/
我的纹理不仅仅是一个盒子或圆形,我的 body 需要与这个形状相同,所以我想结合多个 body 来达到我想要的形状,这甚至可能吗?或者有更好的方法吗?我正在使用带有 libgdx 框架的 java。
我遇到的情况是,我有很多计算机并且需要有唯一的 ID。 他们会通过 API 请求发送其 uniqueId。该对象看起来像 class ID { long timestamp; int id; }
我正在尝试检测一张卡片,但问题是有时图像不好并且有多个背景,如下所示: 没有很好地定义边缘 ![没有很好地定义边缘][1] 示例背景 ![示例背景][2] 我这样做了: gray = cv2.cvtC
我正在尝试从仅包含一辆车和简单背景的图像中分割汽车,如 但是我从我的实现中得到的是这个 和 分别 但它非常容易处理几乎已经分割的图像,例如。 给出类似 的结果 我使用的代码是 import cv2 i
我正在开发一个项目,在该项目中我从另一个对象/函数中引用一个变量。然而我总是返回 false。我不确定我是否正确调用它。 这是验证函数: app.validation = function(){
数组只是伪装的对象吗?为什么/为什么不呢?他们以什么方式(这样/不是)? 我一直认为 JS 中的数组和对象本质上是相同的,主要是因为访问它们是相同的。 var obj = {'I': 'me'}; v
我正在使用 PlayN 构建一个涉及石头的游戏,用户必须在物理世界中移动(通过重力等)。我希望用户能够使用触摸板直接操纵石头,并通过以下方式给它们一个速度拖拽并扔掷它们。 现在我有一个实现,其中每个石
http://jsfiddle.net/goldrunt/jGL84/42/这是来自这个 JS fiddle 的第 84 行。通过取消注释第 141-146 行,可以对球应用 3 种不同的效果。 'b
我学习Linux平台下的OpenGL。最近,我尝试使用 glutBitmapCharacter() 创建的文本作为 glu 或 glut 提供的一些二次对象的纹理。但是,glutBitmapChara
我正在使用 AndEngine 创建一个带有 box2d 扩展名的游戏。我想实现一个条件,当两个物体碰撞时,它们应该被移除或重生。最初我尝试使用 if(sprite1.collidesWith(spr
我制作了一个小型 3d 引擎。 但我在旋转功能方面遇到了一些问题。它们使物体不时拉伸(stretch)。这是数学: this.rotateX = function(angle) { var c
我在 Canvas 上制作了一个矩形 mask ,我需要 mask 外的任何东西都具有 0.8 的不透明度,因此 mask 外的所有对象都被视为不透明请看一下 fiddle 。 http://jsfi
我是 Direct3D 的新手,我在一个项目中从网络摄像头拍照并在它前面绘制一些 3D 对象。 我能够使用正交投影将网络摄像头图像渲染为背景。 //init matrix D3DXMatri
我是一名优秀的程序员,十分优秀!