jjzjj

typetraits

全部标签

c++ - T declval() 而不是 T && declval() for common_type

用std::declval不是更好吗?声明形式:templateTdeclval();//(1)然后是当前的:templateT&&declval();//(2)std::common_type(可能仅出于当前目的使用不同的名称)?common_type的行为使用(1)比使用std::decay_t时的行为更接近三元运算符(但未使用(2))的行为:templateTdeclval();templatestructcommon_type;templateusingcommon_type_t=typenamecommon_type::type;templatestructcommon_ty

c++ - 如何实现 remove_reference

我正在学习类型特征和类型转换(修改?),所以我遇到了std::remove_reference.我试着这样实现它:templatestructremove_reference{typedefTtype;};templatestructremove_reference{typedefconstTtype;};templatestructremove_reference{typedefTtype;};templatestructremove_reference{typedefconstTtype;};现在当我使用它时:remove_reference::typex1;//x1isint:O

c++ - 解决静态断言中不完整的类型

当表达式依赖于类类型本身时,有没有办法在类内部进行static_assert?也许延迟评估直到类型完成或模板实例化之后?示例代码:#includetemplatestructTest{Tx=0;//makenon-trivialstatic_assert(std::is_trivial>::value,"");};intmain(){//wouldlikestaticassertfailure,insteadget'incompletetype'errorTesttest1;Testtest2;return0;} 最佳答案 这是一个

c++ - 带有成员函数指针的部分模板类特化

我有以下工作代码:classperson{private:intage_;public:person():age_(56){}voidage(inta){age_=i;}}templateclassholder;templateclassholder{public:typedeftypenameT::value_typevalue_type;public:explicitholder():setter(FUNC){std::coutsetter;};templateclassholder{public:explicitholder(){std::couth1;holderh2;//th

C++:多态容器/迭代器与编译时概念/特征

背景这纯粹是为了教育目的。如果您不想阅读整个背景,可以跳到底部的问题。我已经编写了一个Queue接口(interface)(抽象类),以及2个基于调整大小的数组和链表的派生实现。templateclassIQueue{public:virtualvoidenqueue(Titem)=0;virtualTdequeue()=0;virtualboolisEmpty()=0;virtualintsize()=0;}templateclassLinkedListQueue:publicIQueue{...}templateclassResizingArrayQueue:publicIQueu

c++ - std::string not nothrow move assignable or comparable?

我在研究type_traits时,发现了std::string的这个奇怪属性:$cata.cpp#include#includestatic_assert(std::is_nothrow_move_assignable::value,"???");static_assert(noexcept(std::declval()==std::declval()),"???");$g++-std=c++14a.cppa.cpp:4:1:error:staticassertionfailed:???static_assert(std::is_nothrow_move_assignable::val

c++ - 我可以通过类型特征来确定指针是否为整数类型吗?

通过使用类型特征,我可以找出类型是整型还是指针(以及更多)。是否也可以查明传递的指针是整型数据类型(int、float、char)而不是对象?编辑:除了Armen's回答,如果有人使用LOKI库而不是Boost,removepointer的功能类似于TypeTraits::PointeeType 最佳答案 boost::is_pointer::value&&boost::is_integral::type>::valueBtwfloat不是整数。您可能需要is_arithmetic 关于

c++ - 有没有办法使用静态断言和类型特征来防止类被派生两次?

我意识到这是一个人为的例子,但我想要一个编译检查来防止这种情况......classA{};classB:publicA{};classC:publicA{};classD:publicB,publicC{BOOST_STATIC_ASSERT((is_base_of_once::value))}; 最佳答案 以下应该有效:BOOST_STATIC_ASSERT(((A*)(D*)0==0))如果A存在两次,这应该会产生歧义错误,否则测试将始终成功(因为它比较两个空指针)。 关于c++-

c++ - lambda 函数不是 throw_move_assignable 吗?

clang-cl(4.0.0-trunk)似乎认为是,而vc2015(update3)认为不是。此实现是否已定义或标准是否规定了lambda函数应如何在术语或nothrow和moveassignable中实现?#include#includetemplatevoidtest_nothrow_move_assignable(T&&){std::cout::value 最佳答案 这是clang错误。来自[expr.prim.lambda]:Theclosuretypeassociatedwithalambda-expressionhas

c++ - std::is_trivially_equality_comparable_v<T>

相关但比C++11staticassertforequalitycomparabletype?神秘得多—JFBastien的论文N4130"PadThyAtomics!"让我想到如果我们要使用atomic::compare_exchange_weak()其中T是类或者结构类型,比如structCount{intstrong_count;intweak_count;};然后我们真的想静态断言两件事:首先,T实际上是无锁原子的:templatestaticconstexprboolis_lockfree_atomic_v=std::atomic::is_always_lock_free;其