草庐IT

typetraits

全部标签

c++ - 从 back_insert_iterator 中提取容器的 value_type 的特征类

std::back_insert_iterator的value_type等于void,但它还有一个protected成员container包含指向底层Container的指针。我正在尝试编写一个traits类来提取容器的value_type,如下所示:#include#include#includetemplatestructoutit_vt:OutputIt{usingself_type=outit_vt;usingvalue_type=typenamestd::remove_pointer_t().container)>::value_type;};intmain(){std::v

c++ - 删除右值,保留左值引用(标准类型特征可用?)

我正在尝试编写一个函数,以std::tuple的形式返回可变参数包的子集。理想情况下,该函数应该没有运行时开销(没有不必要的拷贝),并且它应该允许用户访问lvalue引用并修改它们。应维护值类型、lvalue引用和constlvalue引用。临时对象(rvalue引用)应“转换”为值类型以避免创建无效引用(对临时对象的引用)。期望结果示例:intlr=5;constint&clr=lr;autot=make_subpack_tuple(lr,clr,5);static_assert(is_same>{},"");//Ok,modifieslr:std::get(t)=10;//Comp

c++ - 为什么 std::is_array 对 std::array 返回 false?

自std::array和std::is_array都是在C++11中引入的,编译失败似乎很奇怪:#include#includestatic_assert(std::is_array>::value);有没有一种简单的方法来检查某物是否是一个数组,包括T[N]的两种可能性?和std::array? 最佳答案 std::is_array仅对看起来像T[]的类型定义为真或T[N].std::array不包括在内。您不能修改或专门化std::is_array成为true_type对于std::array在标准之下;这会使您的程序格式错误,

c++ - 函数模板 : Different specializations with type traits

考虑到类模板,可以使用类型特征和虚拟启动器模板参数为某些类型的组提供模板特化。我已经askedthatearlier.现在,对于函数模板,我需要同样的东西:即,我有一个模板函数,并且想要对一组类型进行特化,例如,作为类X的子类型的所有类型>。我可以用这样的类型特征来表达这一点:std::enable_if::value>::type我想过这样做:templatevoidfoo(){//Dosomething}templatevoidfoo::value>::type>(){//Dosomethingdifferent}但是,这不起作用,因为函数模板不允许偏特化。那怎么办呢?也许是类型特

c++ - std::result_of 用于内置运算符

通过result_of确定诸如-int()或double()*double()之类的结果的正确语法是什么?失败std::result_of::typestd::result_of::type 最佳答案 std::result_of真的不是这里采取的方法。decltype做你想做的,可以用作decltype(-int()),decltype(double()*double())等等如果你不知道类型是否是默认构造的,你也可以使用std::declval:decltype(-std::declval()).任何语法涉及operator-的

c++ - 如何测试类 B 是否派生自类的模板族

如何在编译时测试B类是否派生自std::vector?templatestructis_derived_from_vector{staticconstboolvalue=????;};如何在编译时测试类B是否派生自模板族?templateclassFamily>structis_derived_from_template{staticconstboolvalue=????;};使用:templatestructX{};structA:X{}structB:std::vector{}structD:X{}intmain(){std::cout::value::value::value::

c++ - 在模板中,如果从属名称是函数,则调用它

在我的TClass::foo()函数,我想调用一个T实例当且仅当T是函数类型。#include#includetemplatestructTClass{TClass(Tvalue):value(value){}Tvalue;voidfoo(){//if(valueisstd::function)//callfunction;}};intmain(){TClasst1{0};t1.foo();TClass>t2{[](){std::cout我该怎么做? 最佳答案 在C++11中,最简单的方法是通过辅助函数重新推导值:templatea

c++ - 在编译时验证对象是否创建为 shared_ptr

我写的一些类(通常作为boost::asio的一部分)的对象依赖于包装在shared_ptr中,因为它们使用shared_from_this()。如果一个对象没有在shared_ptr中实例化,有没有办法阻止它被编译?所以,我要找的是:std::shared_ptra=std::make_shared();//shouldcompilefinestd::unique_ptra=std::make_unique();//compileerrorMyClassa;//compileerror 最佳答案 将其构造函数设为私有(privat

c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?

有如下一段代码:#include#includetemplate::value>::type>intfun(Ff)//line8{returnf(3);}intl7(intx){returnx%7;}intmain(){autol=[](intx)->int{returnx%7;};fun(l);//line23//fun(l7);thiswillalsofaileventhoughl7isaregularfunctionstd::cout::value;//prints1}我会得到以下错误:main2.cpp:Infunction‘intmain()’:main2.cpp:23:8:

c++ - 如何获取指针类型的指向类型?

我有一个指针类型Ptr。它可能是T*、unique_ptr、shared_ptr或其他。如何在编译时得到它的指向类型?我尝试了以下但失败了templatevoidf(){typedefdecltype(*Ptr())T;//giveunexpectedresults}以下已删除的答案效果很好。typedeftypenamestd::remove_reference())>::typeT; 最佳答案 这是一种方法。创建一个辅助类,使用适当的特化来推断指针类型。templatePointer;templatePointer{typede