#include <tuple>#include <iostream>class Foo{public: Foo () : m_memberInt(5),m_anotherMemberInt(7) {} voID IncrementMembers() {++m_memberInt; ++m_anotherMemberInt;} std::tuple<int &,int &> GetMembers() {return std::tIE(m_memberInt,m_anotherMemberInt);}private: int m_memberInt; int m_anotherMemberInt;};int main(){ Foo foo; // Can't have dangling references. // int &x,&y; // std::tIE(x,y) = foo.GetMembers(); std::tuple<int &,int &> tmpTuple = foo.GetMembers(); int &x = std::get<0>(tmpTuple); int &y = std::get<1>(tmpTuple); std::cout << x << " " << y << std::endl; foo.IncrementMembers(); std::cout << x << " " << y << std::endl; return 0; }
上面的解决方案有效,但是临时std :: tuple和多个std :: gets很烦人,如果可能的话,能够避免这种情况会非常好(比如返回非引用时).
问题是我们不能有悬空引用,所以不能事先初始化变量.是否有一些C 11 / C 14的魔法允许我初始化引用,因为我调用std :: tIE?或者上面是唯一的解决方案?
@R_404_6120@ 在C 17中,结构化绑定为您编写代码.std::tuple<int &,int &> tmpTuple = foo.GetMembers();int &x = std::get<0>(tmpTuple);int &y = std::get<1>(tmpTuple);
大致相同
auto&[x,y] = foo.GetMembers();
(我的C 17代码中可能有轻微的语法错误,我缺乏经验,但你明白了.)
您可以在C 14中使用延续传递样式和适配器执行类似的 *** 作:
template<class Tuple>struct continue_t { Tuple&& tuple; using count = std::tuple_size<std::remove_reference_t<Tuple>>; using indexes = std::make_index_sequence<count{}>; template<std::size_t...Is> auto unpacker(std::index_sequence<Is...>) { return [&](auto&& f)->decltype(auto){ using std::get; // ADL enabled return decltype(f)(f)( get<Is>(std::forward<Tuple>(tuple))... ); }; }; template<class F> decltype(auto) operator->*( F&& f )&& { auto unpack = unpacker( indexes{} ); return unpack( std::forward<F>(f) ); }};template<class F>continue_t<F> cps( F&& f ) {return {std::forward<F>(f)};}
哪个模数错字,给你:
cps(foo.GetMembers())->*[&](int& x,int&y){ std::cout << x << " " << y << std::endl; foo.IncrementMembers(); std::cout << x << " " << y << std::endl;};return 0;
这很奇怪. (注意,cps支持返回对或std :: arrays以及任何“类似tuple”的函数).
实际上没有更好的方法来处理这种结构化绑定,其中有一个原因是添加到C 17.
一个可怕的预处理程序黑客可能写得如下:
BIND_VARS( foo.GetMembers(),x,y );
但是代码量会很大,我所知道的编译器没有让你调试会产生的混乱,你会得到预处理器和C交集引起的所有奇怪的怪癖等等.
总结以上是内存溢出为你收集整理的c – 使用std :: tie初始化多个引用全部内容,希望文章能够帮你解决c – 使用std :: tie初始化多个引用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)