问题标签 [stdtuple]

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.

0 投票
2 回答
316 浏览

c++ - 是否可以避免在元组上重复 std::move() ?

假设我有一个元组和一个函数:

所以在一个辅助函数中,我将元组展开为参数:

它有效,但我想避免重复std::move多次。天真的解决方案,例如:

显然不起作用,因为 rt 是lvalue. 那么有没有办法避免std::move()每个重复多次std::get

0 投票
0 回答
691 浏览

c++11 - std::get<> 和 std::tuple<> 比原始指针慢吗?

我有一个 C++11 应用程序,我通常会针对各种算法迭代几种不同的数组结构。原始 CPU 性能对于这个应用程序很重要。

数组元素是基本类型(int、double、..)或简单结构。该数组通常有数万个元素长。我经常需要在给定的循环中一次迭代多个数组。所以通常我需要一个指针来处理任何类型的每个数组。所以有时我需要增加五个冗长的单独指针。

基于这些关于元组的答案, 为什么 std::pair 比 std::tuple C++11 元组性能更快, 我希望使用元组将指针打包到一个对象中没有开销。

我认为实现一个类似对象的游标来帮助迭代可能会很好,因为缺少特定指针上的增量将是一个烦人的错误。

允许您以类型安全的方式将一堆变量捆绑在一起。然后你可以实现一个可变参数模板函数,以一种类型安全的方式递增元组中的每个指针。

然而...

当我测量性能时,元组版本比使用原始指针要慢。但是当我查看生成的程序集时,我在元组循环增量中看到了额外的 mov 指令。也许是由于std::get<>返回参考的事实?我曾希望它会被编译掉......

我是否遗漏了某些东西,或者像这样使用原始指针是否会击败元组?这是一个简单的测试工具。我扔掉了花哨的光标代码,只使用 astd::tuple<>进行这个测试

在我的机器上,对于各种数据大小,元组循环的速度始终是原始指针版本的两倍。

我的系统配置是 Windows 8 上的 Visual C++ 2013 x64,带有发布版本。我确实尝试在 Visual Studio 中打开各种优化,例如内联函数扩展:任何合适的 (/Ob2),但它似乎并没有改变我案例的时间结果。

我确实需要做两件额外的事情来避免 VS 的激进优化
1)我强制测试数据数组分配在堆上,而不是堆栈上。这在我计时时产生了很大的不同,可能是由于内存缓存效应。
2)我通过在最后写入静态变量来强制产生副作用,这样编译器就不会跳过我的循环。

0 投票
1 回答
95 浏览

c++ - 使用类型参数包和对应值的输入数组构造类型

在发布这个问题之前,我已经尝试过这里这里这里提到的方法。但是,没有什么可以解决我的要求,因为我有一个需要一些调整的中间功能。

基本上,我所拥有的如下。我必须T根据类型存储在参数包中的参数Args和数组中的相应值来构造类型ARGValue *ptr

但是,要将 type from 的值映射ARGValue* ptr到 in 的类型,Args... 我需要执行如下中间操作。

我该如何解决这个问题?如何安全地获取Args...from中所有类型的值ARGValue*,然后构造类型T

我不想为多个参数创建特化,因为它可能会使代码混乱。

0 投票
2 回答
86 浏览

c++ - 一个引用的C++多次转发:先复制再移动

考虑以下代码,其中相同的引用被转发两次到一个基类并在那里构造一个元组:

Derived首先调用as中的基类构造函数,Base<T, T>{t, std::forward<_T>(t)}然后调用元组构造函数 usingtup{std::forward<Ts>(ts)...}具有以下原因:

t是一个右值引用时,第一个元组参数应该传递一个左值引用t,因此通过一个副本来构造t,而第二个元组元素应该得到一个右值引用,因此,如果可能的话,使用移动进行构造。

这种方法似乎得到了关于 SO(例如, hereherehere)的几个问题和答案的支持,这些问题和答案表明braced-init 列表对其参数进行从左到右的评估。

但是,当我在一个简单的示例中使用上述代码时,实际行为(始终)与我的预期相反:

这是在 Coliru 上使用 gcc 的示例。(gcc 编译器在这方面显然有过一次错误,但距今已有大约两年了,应该不再有问题了。)

问题:

  • 我在这里的实施或假设哪里错了?
  • 如何修复上述代码以使其行为符合预期:首先复制——然后移动?
0 投票
2 回答
186 浏览

c++ - 如何递归元组?

我正在尝试制作一个存储元素向量元组的可变参数模板容器。这个容器的重点是所有向量中的元素都是相关的,我想在以后保持这种相关性,但这对于计算来说不是必需的。想象一下,如果你愿意的话,一个 vector_3 和一个某种类型的 ref_id。

容器只会将向量统一地变异在一起。所以我理解的部分看起来像这样:

我正在努力使用插入方法。我在想一些事情:

但我不知道如何初始化这个“插入器”元组。我一直在 stackoverflow 上查看各种递归模板示例,但我无法将其全部记在脑海中足够长的时间来理解它。

我假设如果我有这样一个元组,我可以使用简单的赋值:

我还想在所有返回值元组的数组中编写一个访问器:

但是再一次,我不知道如何初始化这个元组。

我不可能是唯一一个想要这样做的人,而且我找不到好的资源来学习它。同时,我正在尝试消化 0x 的原始可变参数模板提案。洞察力将不胜感激。我受到 MSVC 2012 实施的限制。

0 投票
1 回答
101 浏览

c++11 - 有没有办法将元组转换为具有不同项目类型的另一个元组?

是否可以将std::string元组中的所有项目转换为const char*

我面临的问题是我尝试将可变参数模板打印到文件

tup 中的第一项是格式字符串(const char*当然),其余的是打印参数。args 可能包含std::string. 问题是fprintf不拿std::string。如何将std::string元组内的所有内容转换为const char*并形成另一个元组?

tup完成打印之前不会超出范围。

0 投票
2 回答
514 浏览

c++ - 如何比较不同长度的元组?

我想写一个比较器来比较不同长度但具有相同“前缀”的元组。考虑以下情况,我有两个元组。


我想为 t1 < t2 应用“less”,其中只有两个元组的第一个成员被比较(相同类型?),第三个被省略。可能吗?

0 投票
1 回答
720 浏览

c++ - “错误:元组没有可行的转换......”使用make_tuple

我试图有一个函数 return std::tuple<Qstring, int>,但我得到了这个编译器错误:

`错误:从 'tuple<[...], typename __make_tuple_return::type>' 到 'tuple<[...], int>' 没有可行的转换

我究竟做错了什么?

0 投票
3 回答
205 浏览

c++ - 从可调用元组的结果创建一个元组

我有一个可调用类型的元组。

我想创建另一个具有每个可调用结果类型的元组。例如,funcs包含int->intdouble->std::string

我怎样才能创建一个results依赖于每个元素的元组,funcs看起来像这样。

0 投票
1 回答
1550 浏览

c++ - 在可变参数模板类的构造函数中初始化元组成员

假设我有一个变量类:

现在我定义一个包含变量的系统类:

我如何定义的构造函数System会以某种方式传递它的 agrumentsvariables来初始化它们中的每一个?我希望能够写出这样的东西: