草庐IT

custom_tuple

全部标签

c++ - 为什么 std::pair<A,B> 与 std::tuple<A,B> 不同? (真的没有办法吗?)

为什么是std::pair与std::tuple不同?不能只用一个代替另一个总是感觉很奇怪。它们在某种程度上是可转换的,但有一些限制。我知道std::pair需要有两个数据成员Afirst和Bsecond,所以它不能只是std::tuple的类型别名.但我的直觉说我们可以专攻std::tuple,即正好有两个元素的元组,等于标准要求的定义std::pair成为。然后将其别名为std::pair.我想这是不可能的,因为它太简单了以至于没有想到,但是例如在g++的libstdc++中并没有这样做(我没有查看其他库的源代码)。这个定义的问题是什么?是否“只是”会破坏标准库的二进制兼容性?

C++:std::tuple_size/tuple_element 可以专门化吗?

是std::tuple_size的特化和std::tuple_element允许自定义类型?我想是的,但我想绝对确定,我找不到任何具体信息。示例(省略了命名空间、成员函数和get重载):templatestructvector{T_data[N];};templateconstexprT&get(vector&vec){returnvec._data[I];}namespacestd{templateclasstuple_size>:publicstd::integral_constant{};templateclasstuple_element>{public:usingtype=T

c++ - std::tuple 和标准布局

如果std::tuple的所有成员都是standardlayouttypes,是std::tuple本身的标准布局吗?用户定义的复制构造函数的存在使它变得不平凡,但我想知道它是否仍然可以是标准布局。引用规范会很好。 最佳答案 不,标准布局要求所有非静态数据成员属于一个基子对象或直接属于最派生的类型,std::tuple的典型实现为每个基类实现一个成员。由于成员声明不能是包扩展,根据上述要求,标准布局tuple不能有多个成员。实现仍然可以通过将所有tuple“成员”存储在一个char[]中,并通过reinterpret_cast获取对

c++ - 检测类型是否为 std::tuple?

目前我有两个功能:templateboolf(Type*x);templateboolf(std::tuple*x);有什么方法可以将这两个函数与一个额外的模板参数合并,该参数指示传递的类型是否为元组?templateboolf(Type*x); 最佳答案 当然,使用is_specialization_of(链接取自here并已修复):template::value>boolf(Type*x);然而,问题是,你真的想要这样吗?通常,如果您需要知道一个类型是否是元组,您需要对元组进行特殊处理,这通常与它的模板参数有关。因此,您可能希望

c++ - `void f(A<0>, tuple<T *...>)` 不是比 `void f(A<I>, tuple<T *...>)` 更专业吗?

#includetemplatestructA{};templatevoidf(A,std::tuple){}templatevoidf(A,std::tuple){}intmain(){f(A{},std::tuple{});}不是f的第二次重载吗?更专业?g++4.9.2表示调用不明确,clang3.6.0接受它。哪个编译器是对的?有趣的是,如果您更改std::tuple至std::tuple,g++就可以了,这个我没看懂。 最佳答案 根据当前规则,第二个重载更加特化。一些专业A具有合成值@无法与A匹配,但是A可以匹配A(与I=

c++ - boost 是否支持 c++11 的 std::tuple 的序列化?

boost是否支持c++11的std::tuple序列化?我在/boost/serialization/中找不到tuple.hpp头文件我正在使用boost1.52.0(如果需要,很乐意升级,但似乎changesinversion1.53与此无关)。 最佳答案 开箱即用,不。您必须自己编写序列化程序。幸运的是,有人已经这样做了:C++0xtupleboostserialization(也在github中) 关于c++-boost是否支持c++11的std::tuple的序列化?,我们在S

c++ - 为什么 `initializer_list<pair>` 和 `initializer_list<tuple>` 的行为不同?

以下代码编译并运行:#include#include#include#includevoidext(std::initializer_list>>myList){//Dosomething}///////////////////////////////////////////////////////////intmain(void){ext({{1.0,{2.0,3.0,4.0}}});return0;}虽然这个没有:#include#include#include#includevoidext(std::initializer_list>>myList){//Dosomething}

c++ - 如何从 add_custom_target/command 调用 CMake 函数?

是否可以从add_custom_target或add_custom_command中调用CMake函数?我知道我可以将CMake函数移动到Python(或其他)脚本并从add_custom_target/command调用它,但我想避免使用大量脚本在现有的CMake基础设施旁边。我想要实现的是使用CPack生成二进制工件的zip包并将它们发布到工件存储库中。对于发布部分,我已经创建了CMake函数,但现在我需要将打包和发布结合在一起。提前感谢您的任何帮助/提示。 最佳答案 我在为BVLC/Caffe编写CMake构建系统时遇到了这个

C++11 可变参数模板 : return tuple from variable list of vectors

我想写一些类似于pythonzip(http://docs.python.org/2/library/functions.html)的东西。zip应该接受可变数量的不同类型的vector,并返回一个vector元组,截断到最短输入的长度。例如x=[1,2,3]v=['a','b']我希望输出是一个vector[,]如何在C++11中做到这一点? 最佳答案 急切地做到这一点并且只通过复制非常容易:#include#include#includetemplatestd::vector>zip(std::vectorconst&...vs

c++ - std::get 与 std::tuple 的效率

我很好奇调用std::get的查找时间。在std::tuple需要。一些简短的谷歌搜索(包括通常包含此信息的引用页面)没有结果。我最初的直觉(和恐惧)是元组的递归结构(如果它被实现为可变参数模板)会导致需要N次查找的顺序(对get(t)的调用看起来像t.rest().rest().first()。我希望我能离开这里......再一次,我希望编译器能够对此进行优化,以直接返回正确的偏移量,而不会产生N次调用的开销。基本上我想要的是:运行时是否有特定的保证?这是否限制了std::tuple实现了吗? 最佳答案 效率将与访问结构的成员相当