问题标签 [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 投票
1 回答
1442 浏览

c++ - “解包” std::array作为函数的参数

这是一个很好的(不是我的)例子,你可以如何扩展(或“爆炸”)元组作为函数的参数:

那么你可以像这样使用它:

现场版

std::array我在徘徊,因为它很像元组,你怎么能做同样的事情。std::get<N>一起工作,std::array所以我认为修改这个解决方案很容易。但是这样的事情不起作用:

因为部分std::result_of<FT(Arg&&)>::type。参数类型Arg&&错误并且result_of没有字段type。对于元组Args&&...扩展,但现在应该“重复”I次。有没有办法使用result_of这样可以扣除返回的类型?

我也想知道,拥有“解包”的工具,tuple是否array可以递归地“解包”(可能使用enable_if)结构tuple<array<int, 2>, tuple<array<double,3>, ...之类的?某种树在哪里是树枝,tuplearray其他类型是叶子?

0 投票
1 回答
1309 浏览

c++ - std::make_map? 统一初始化

以下作品:

以下没有:

有没有办法在不使用额外变量的情况下初始化用 make_tuple 制作的元组内的地图?

0 投票
1 回答
1266 浏览

c++ - 在元组的每个元素上一般调用成员函数

第一步:展开一个元组并将元素传递给一个函数:

我有一个带有 N 个参数的函数

和一个匹配类型的元组

根据这个stackoverflow question,我可以扩展元组并调用函数。

第二步:展开一个元组并将调用每个元素的成员函数的结果传递给一个函数:

更进一步,我的元组包含一个类模板的多个实例:

Foo有一个成员函数,Foo<T>::get()它返回一个类型的值T

根据这个 stackoverflow 答案,我有下面的工作代码,它扩展元组并调用element.get()每个元素,最终将结果传递给func.

不幸的是,我已将调用硬编码element.get().

第三步:对每个元组元素调用哪个成员函数的规范是通用的:

(这就是我正在寻求帮助的事情)

是否有可能使这个通用?也就是说,传递要调用的成员函数apply因此将其作为通用实用程序?

我想也许我可以std::mem_fn用来包装一个函数 ( std::mem_fn(&Foo::get)) 并将结果对象传递给apply,但这不起作用,因为Foo它是一个类模板:

error: ‘template<class T> struct Foo’ used without template parameters

有没有办法让这个通用?

下面的工作示例:

0 投票
1 回答
2609 浏览

c++ - 比较具有替代排序的自定义类型的 std::tuple(或 std::pair)。是否可以插入自定义小于/比较功能?

问题

我有一个自定义类型A,它具有自然排序(有operator<)和多个替代排序(区分大小写、不区分大小写等)。现在我有一个std::pair(或std::tuple)由(一个或多个)组成A。以下是一些我想比较的类型示例:std::pair<A, int>, std::pair<int, A>, std::tuple<A, int, int>, std::tuple<int, A, int>. 我如何使用默认的逐元素比较实现来比较std::pair(或),插入我的比较函数?std::tupleA

编码

下面的代码无法编译:

这是因为operator<没有为struct A. 将其添加到LOCATION-1上面将解决问题:

现在,我们有另一种排序方式struct A

假设我们想保留原来operator<的 for struct A(区分大小写的),我们如何std::pair<A, int>与这种替代排序进行比较?

我知道添加operator<for的专用版本可以std::pair<A, int>解决问题:

但是,我认为这是一个次优的解决方案。

首先,对于std::pair,重新实现逐元素比较很容易,但std::tuple它可能很复杂(处理可变参数模板)并且容易出错。

其次,我几乎无法相信这是解决问题的最佳实践方法:想象我们必须为operator<以下每个类定义一个专门的版本:std::tuple<A, int, int>, std::tuple<int, A, int>, std::tuple<int, int, A>, std::tuple<A, A, int>, ... (这甚至不是一种实用的方法!)

重新使用编写良好的内置operator<forstd::tuple并插入我less-than的 forstruct A将是我想要的。可能吗?提前致谢!

0 投票
2 回答
255 浏览

c++ - 左值的完美转发失败

我有一个实用程序函数,它遍历一个元组,并且对于每个元素,用该元素调用一个函数,最后用所有元组元素的结果调用另一个函数。

为了更好地说明:

  • 有各种类型的元组tuple<Foo<int>, Bar<double>, Baz<char>>
  • 每种类型都有一个隐式接口Foo,该接口返回对某个内部成员的引用。BarBazClassT::data()T&
  • 你有一个带有签名的函数void (int, double, char)

该实用程序遍历元组成员,提取对内部成员的引用,并使用所需参数调用函数。

问题:完美转发

我尝试使用所谓的“通用引用”和完美转发来实现该实用程序,从而消除了对多个左值/右值和 const/non-const 重载的需要。

虽然函数的参数是类型

我无法将左值绑定到它。为什么是这样?

我在这里提出了一个类似的问题,这个问题已经解决了;但是,由于这是一个不相关的问题,我相信这需要一个新问题

ideone 示例:https ://ideone.com/lO5JOB

0 投票
1 回答
486 浏览

c++ - 如何从 C++ 中的可变参数模板类派生

我有可变参数模板类,它只是 std::tuple 的包装器:

如何正确派生一个类Tpl

编译器(VS14 CTP 6)消息只是告诉我:

0 投票
1 回答
173 浏览

templates - 在元组和向量上递归的非空函数模板

我制作了一个计算数字正弦的函数。如果是 ,则返回输入类型std::is_floating_point。但是对于std::is_integral,它返回一个double

很容易。现在我希望它适用于vectors (或数组)和tuples (或集群)。以便:

在大多数关于模板的示例中tuple,该函数要么没有返回值,要么返回一个累积值,要么具有与输入相同的返回类型。

我已经对这些主题(除其他外)进行了很多实验: 遍历嵌套的 C++11 元组c++11:从模板函数构建 std::tuple如何在 C+ 中创建一个压缩两个元组的函数+11(STL)?

最后一个特别有用。我已经为tuples 工作了,但不适用于递归tuplestuples in tuples)。

最终(如果这可能的话),我将不得不使用 gcc 4.9.2 制作mycos, mytan,myasin等。

**编辑:**所以这是我在 Yakk 的建议之后提出的,并进行了一些调整:

这行得通。需要 c++14。

0 投票
2 回答
79 浏览

c++ - 模板循环遍历元组

我正在使用可变参数模板,目前正在尝试operator<<为元组实现。

我试过下面的代码,但它没有编译(GCC 4.9 with -std=c++11)。

错误消息非常神秘且冗长,但它基本上表示没有匹配的函数调用获取。有人可以向我解释为什么吗?谢谢。

编辑:这是我正在使用的模板实例化

0 投票
2 回答
790 浏览

c++ - 如何删除类型名中每个元素的 const ref 修饰符... T

我刚刚开始用可变参数版本替换我的一些旧模板,以避免代码重复(或丑陋的宏)用于具有可变数量参数的重载。

我遇到但尚未解决的一个问题是:如何从属于“混合类型名...”的任何类型中删除 const& ?

这是我的例子:

由于旧解决方案需要每个参数数量的版本,我想用可变参数解决方案替换它。

不幸的是,可变参数版本失败了

因为 tN 变成

但显然需要

让我工作。

欢迎任何想法:)

0 投票
1 回答
333 浏览

c++ - C++: Using type as map key introduces template substitution errors

I'm using a tuple as a key to track elements in a map, and then later iterating over the map to produce a string version of the map. To help me with the conversion, I have a template convenience function that will concatenate the tuple used as the key (inspired by this answer).

I can insert elements into the map and iterate without error

But when I try to iterate over the map, I get a substitution error:

producing (g++ 4.2.1 on OSX, removed extraneous enable_if notes)

As it says in the error message, the template I want it to use was ignored due to substitution failure. What difference did I introduce when I moved it to the map, and how would I correct it?