如何做互联网营销,seo怎么做网站排名,wordpress安卓版教程视频,云南南网站开发一、std::tuple
std::tuple在应用中有着独特的作用#xff0c;它本身可以存储非同质化的数据类型#xff0c;这个在某些场合下非常有用。std::tuple的初级应用#xff0c;如生成和获取#xff0c;在前面的几篇文章中已经进行了较详细的说明。但std::tuple仍然有一些复杂的…一、std::tuple
std::tuple在应用中有着独特的作用它本身可以存储非同质化的数据类型这个在某些场合下非常有用。std::tuple的初级应用如生成和获取在前面的几篇文章中已经进行了较详细的说明。但std::tuple仍然有一些复杂的应用在实际的应用过程中有很大的作用比如遍历本文将在这些角度上进行举例分析。
二、复合操作 1、遍历 std::tuple的遍历在STL库并未提供它的实现机理是一个特化的过程所以不能将其理解为容器这也是没有提供遍历的可能吧。在前面讲过的遍历变参的基础上其实还是比较容易想到如何遍历tuple的
template class Tp, std::size_t N struct TupleData {static void output(const Tp t) {TupleDataTp, N - 1::output(t);std::cout std::getN - 1(t) std::endl;}
};
//利用模板的偏特化
template class Tp struct TupleDataTp, 1 {static void output(const Tp t) { std::cout std::get0(t) std::endl; }
};template class... Args void PrintTuple(const std::tupleArgs... t) {TupleDatadecltype(t), sizeof...(Args)::output(t);
}
void ForEachTuple() { PrintTuple(std::make_tuple(id, 123456, 23, man)); }而使用make_index_sequence方式遍历Tuple需要C17以上的版本这个在前面的文章中提供过这里再拷贝一次对比
template typename Tp, std::size_t... ID void DisplayTuple(const Tp tp, std::index_sequenceID...) {((std::cout std::getID(tp) std::endl), ...);
}template typename... Args void GetTuple(const std::tupleArgs... tp) {DisplayTuple(tp, std::index_sequence_forArgs...{});//等同std::make_index_sequencesizeof...(Args){}
}也可以使用std::apply自动解包
template typename T, typename F auto static useApplyDisplay(T tp, F fn) {std::apply([fn](auto ...args) { ((fn(args)), ...); }, tp);
}int main() {std::tuple tp(abc, 3, 66, 4, object);auto displayTuple [](auto a) { std::cout a ; };useApplyDisplay(tp, displayTuple);return 0;
}需要注意的是无法直接象遍历容器一样使用变量索引std::get之类的方式去遍历模板中的tuple。遍历的方法有很多开源库和网上有不少的相关例程特别是随着C更新的标准出台更多简单易行的方法会跟随出来。
可参看前文“c17中的apply和make_from_tuple”
2、组合 这个和std::tuple_cat类似
template typename Tp1, typename Tp2, std::size_t... Id1, std::size_t... Id2
constexpr auto tupleCat(const Tp1 tp1, const Tp2 tp2, std::index_sequenceId1..., std::index_sequenceId2...) {return std::make_tuple(std::getId1(tp1)..., std::getId2(tp2)...);
}template typename... Args1, typename... Args2
constexpr auto operator(const std::tupleArgs1... t1, const std::tupleArgs2... t2) {return tupleCat(t1, t2, std::index_sequence_forArgs1...{}, std::index_sequence_forArgs2...{});
}
int main() {std::tuple t1{1, 3.0f, abc};std::tuple t2{33, 1b8c, a};auto x t1 t2;return 0;
}其实弄明白了std::index_sequence 这些都好理解了。还是要抓住基础中的关键环节这才是灵活应用的前提。
三、总结 std::tuple很多人看上去觉得有些鸡肋确实也如此从易用角度来看它还需要一段路来走。不过还是那句话只有最合适的没有最好的。只要有伯乐总会有千里马。把它用在合适的场景上就能够起到事半功倍的效果。