问题标签 [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.
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>, ...
之类的?某种树在哪里是树枝,tuple
而array
其他类型是叶子?
c++ - std::make_map? 统一初始化
以下作品:
以下没有:
有没有办法在不使用额外变量的情况下初始化用 make_tuple 制作的元组内的地图?
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
有没有办法让这个通用?
下面的工作示例:
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::tuple
A
编码
下面的代码无法编译:
这是因为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
将是我想要的。可能吗?提前致谢!
c++ - 左值的完美转发失败
我有一个实用程序函数,它遍历一个元组,并且对于每个元素,用该元素调用一个函数,最后用所有元组元素的结果调用另一个函数。
为了更好地说明:
- 有各种类型的元组
tuple<Foo<int>, Bar<double>, Baz<char>>
- 每种类型都有一个隐式接口
Foo
,该接口返回对某个内部成员的引用。Bar
Baz
ClassT::data()
T&
- 你有一个带有签名的函数
void (int, double, char)
该实用程序遍历元组成员,提取对内部成员的引用,并使用所需参数调用函数。
问题:完美转发
我尝试使用所谓的“通用引用”和完美转发来实现该实用程序,从而消除了对多个左值/右值和 const/non-const 重载的需要。
虽然函数的参数是类型
我无法将左值绑定到它。为什么是这样?
我在这里提出了一个类似的问题,这个问题已经解决了;但是,由于这是一个不相关的问题,我相信这需要一个新问题
ideone 示例:https ://ideone.com/lO5JOB
c++ - 如何从 C++ 中的可变参数模板类派生
我有可变参数模板类,它只是 std::tuple 的包装器:
如何正确派生一个类Tpl
?
编译器(VS14 CTP 6)消息只是告诉我:
templates - 在元组和向量上递归的非空函数模板
我制作了一个计算数字正弦的函数。如果是 ,则返回输入类型std::is_floating_point
。但是对于std::is_integral
,它返回一个double
。
很容易。现在我希望它适用于vector
s (或数组)和tuple
s (或集群)。以便:
在大多数关于模板的示例中tuple
,该函数要么没有返回值,要么返回一个累积值,要么具有与输入相同的返回类型。
我已经对这些主题(除其他外)进行了很多实验: 遍历嵌套的 C++11 元组、c++11:从模板函数构建 std::tuple、如何在 C+ 中创建一个压缩两个元组的函数+11(STL)?
最后一个特别有用。我已经为tuple
s 工作了,但不适用于递归tuples
(tuple
s in tuple
s)。
最终(如果这可能的话),我将不得不使用 gcc 4.9.2 制作mycos
, mytan
,myasin
等。
**编辑:**所以这是我在 Yakk 的建议之后提出的,并进行了一些调整:
这行得通。需要 c++14。
c++ - 模板循环遍历元组
我正在使用可变参数模板,目前正在尝试operator<<
为元组实现。
我试过下面的代码,但它没有编译(GCC 4.9 with -std=c++11)。
错误消息非常神秘且冗长,但它基本上表示没有匹配的函数调用获取。有人可以向我解释为什么吗?谢谢。
编辑:这是我正在使用的模板实例化
c++ - 如何删除类型名中每个元素的 const ref 修饰符... T
我刚刚开始用可变参数版本替换我的一些旧模板,以避免代码重复(或丑陋的宏)用于具有可变数量参数的重载。
我遇到但尚未解决的一个问题是:如何从属于“混合类型名...”的任何类型中删除 const& ?
这是我的例子:
由于旧解决方案需要每个参数数量的版本,我想用可变参数解决方案替换它。
不幸的是,可变参数版本失败了
因为 tN 变成
但显然需要
让我工作。
欢迎任何想法:)
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?