【发布时间】:2021-05-15 05:46:18
【问题描述】:
我想要一个实用程序将std::tuple<T,U> 转换为std::pair<T,U>,同时保持std::tuple<T, U, V, W...> 不变。
此外,我希望这个实用程序
- 做一个函数对象,而不是一个函数,这样我就可以随心所欲地传递它;
- 强制它的输入必须是
std::tuple; - 尽可能利用移动语义,这样做是有意义的。
对我来说,最后一点是困难的部分,也是我提出这个问题的原因。
我知道元组可以存储值和引用(左值引用和右值引用),所以想象一下,如果使用右值 2 元组输入所寻找的函数,它可以从非引用组件中窃取资源,但应保持参考组件不变。
举个例子
A a;
B b;
std::tuple<A, B&> t{a,b};
我知道a 被复制到元组中,而b 不是,我认为这样做
auto p{to_pair(t)};
应该生成一个std::pair<A, B&>,其中包含a 的另一个副本以及对目前唯一存在的b 的引用。
另一方面,做
B b;
auto p{to_pair(std::tuple<A, B&>{A{},b})};
应该再次生成std::pair<A, B&>,但这将包含不应复制的A{};无论如何它都会引用b。
上面描述的场景已经足以让我怀疑该怎么做,更不用说考虑&/const&/&&的其他组合了。
前段时间,answering a question about std::tuples and perfect forwarding 遇到了困难,但我永远不能说我已经完全理解了它们。
【问题讨论】:
-
在后一个用例中,您必须至少移动
A{},因为它已经存在于tuple中。可以吗? -
@DavisHerring,如果你的意思是它从临时元组移动到非临时对,而不是在对中构建,那完全没问题。而且我怀疑这是我在不陷入无意义代码的情况下能做的最多的事情?还是不行?
-
std::make_from_tuple不会为您完成几乎所有的工作吗? -
我不知道这个功能。应该会吧我会尽快检查的。
-
@DavisHerring,你的意思是 this?
标签: c++ tuples c++17 template-meta-programming perfect-forwarding