草庐IT

typetraits

全部标签

c++ - 检查类是否具有 typedef(私有(private)或其他)的特征

有没有办法检查class有一个typedef这甚至适用于privatetypedef?以下代码在VS2013中有效,但在ideone'sgcc上失败templatestructto_void{typedefvoidtype;};classFoo{typedefintTD;};templatestructhas_TD:std::false_type{};templatestructhas_TD::type>:std::true_type{};intmain(){std::cout::value编辑-我为什么要这个我有自定义序列化系统,可以序列化任意类型。当它必须表现不同时(例如字符串),

c++ - 从成员函数指针获取方法的返回类型

我试图声明一个变量,使其类型与我有一个成员函数指针的成员函数的返回类型相同。classWidget{public:std::chrono::millisecondsFoo();};例如,给定一个成员函数指针fn指向Widget::Foo,我将如何声明一个变量blah这样它就得到了Widget::Foo的返回类型(std::chrono::milliseconds)?我从一篇使用result_of的博客文章中找到了一些有希望的指导。来自连同decltype,但我似乎无法让它工作。autofn=&Widget::Foo;Widgetw;std::result_of::typeblah;这种

c++ - std::remove_cv 应该在 const T 数组上产生什么类型?

应该是什么类型std::remove_cv生产?int[3]或constint[3]?constint[3]是一个arrayof3constint对吧?,并且没有顶级cv限定符。所以它不应该产生constint[3]吗??最新版本的gcc/libstdc++正在生成int[3]我认为。这是一个错误吗?为什么/为什么不? 最佳答案 N4140§3.9.3[basic.type.qualifier]/p5,强调我的:Cv-qualifiersappliedtoanarraytypeattachtotheunderlyingelement

C++ this怎么不是成员函数指针?

根据以下测试:std::cout::value不是成员函数指针,而是普通函数,而这个:std::cout::value计算结果为真。我用gcc和msvc都试过了。这两个声明有什么区别?这些结果正确吗?为什么A::*周围的括号很重要? 最佳答案 intA::*()是函数类型,它返回A的int成员,不带任何参数。所以它不是成员函数指针,更不是函数指针。std::cout::value::value::value括号改变了优先级,int(A::*)()是A的成员函数指针类型,返回int并且不带任何参数。

c++ - 帮助类型特征

假设我们有以下模板类templateclassWrap{/*...*/};我们无法改变Wrap.这很重要。让有派生自Wrap的类.例如,classNewInt:publicWrap{/*...*/};classMyClass:publicWrap{/*...*/};classFoo:publicWrap{/*...*/};我们也不能改变这些类。以上所有类(class)都是第3方。它们不是我的。我需要以下编译时间type_traits:templatestructis_derived_from_Wrap{staticconstboolvalue=/**/;};我需要什么?assert(i

c++ - 提取可变参数模板参数包并将其用于类型特征元函数中的另一个可变参数模板?

我想确定是否有任何可变参数类模板是另一个类的基础。通常我会使用std::is_base_of,但我认为我的用例不适合,而且我不确定std或boost中是否已经有一些东西可以处理这个问题。我希望可变参数基类模板的参数包来自另一个可变参数类模板。下面是一些示例代码,希望能解释我想做什么:用法:is_variadic_base_of::value;勇气://testforvariadicbaseofnon-variadictemplateclassA,typenameB,typename...ArgsC>structis_variadic_base_of:std::is_base_of,B>

c++ - 测试是否存在左移运算符

我正在尝试找到一个工作类型特征来检测给定类型是否具有std::ostream的左移运算符重载(例如,可与std::cout或boost::lexical_cast互操作)。我在boost::has_left_shift上取得了成功除了类型是POD或std::string的STL容器的情况类型。我怀疑这与STL类型或operatorstd::ostream的有效左移运算符一般识别类型的正确方法是什么??如果那不可行,是否有单独的方法来检测POD或std::string类型的STL容器上左移运算符的过载?下面的代码显示了我目前正在使用的内容,并演示了如何boost::has_left_sh

c++: 'std::is_fundamental' 的替代方案?

在模板类中的函数中,我试图区分基本类型和其他类型。在C++11中你可以这样做:if(std::is_fundamental::value){//Treatitasaprimitive}else{//Treatitotherwise}如果我错了,请纠正我,这不仅在C++11中。在早期版本的c++中是否有替代方案? 最佳答案 你可以使用Boost'stypetraits在C++03中是这样的:#include...if(boost::is_fundamental::value){//Treatitasaprimitive}else{//

c++ - 拥有 constexpr 静态字符串会导致链接器错误

下面的程序给我一个链接时错误:#includestructTest{staticconstexprchartext[]="Text";};intmain(){std::cout错误信息是/tmp/main-35f287.o:Infunction`main':main.cpp:(.text+0x4):undefinedreferenceto`Test::text'main.cpp:(.text+0x13):undefinedreferenceto`Test::text'clang:error:linkercommandfailedwithexitcode1(use-vtoseeinvoc

c++ - 用户定义类型的 std::common_type 特征

自C++11以来,引入了类型特征std::common_type。std::common_type确定其所有模板参数之间的公共(public)类型。在C++14中,还引入了辅助类型std::common_type_t以缩短使用std::common_type类型特征的代码。std::common_type在重载算术运算符中特别有用,例如,templatestd::common_type_toperator+(T1const&t1,T2const&t2){returnt1+t2;}如果它的模板参数是内置类型(例如,int、double),它会工作得很好。但是,如果我将用户定义的类型作为模