首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++那些事之SFINAE

不仅RTTI并不总是可用,而且它还提供给您不仅仅是操作对象的当前类型。在某些情况下,例如序列化,动态语言或具有反射功能语言确实很方便。...如您所见,在序列化过程中,很容易检查对象是否具有属性并查询该属性类型。在我们例子中,它允许我们使用serialize方法(如果可用),否则返回到更通用方法str。功能强大,不是吗?...根据名称找出所有适用函数函数模板对于适用函数模板,要根据实际情况对模板形参进行替换; 替换过程中如果发生错误,这个模板会被丢弃 在上面两步生成可行函数集合中,编译器会寻找一个最佳匹配,产生对该函数调用...如果没有找到最佳匹配,或者找到多个匹配程度相当函数,则编译器需要报错。...现在,auto可以用于函数方法返回类型

2.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

现代C++之SFINAE

不仅RTTI并不总是可用,而且它还提供给您不仅仅是操作对象的当前类型。在某些情况下,例如序列化,动态语言或具有反射功能语言确实很方便。...如您所见,在序列化过程中,很容易检查对象是否具有属性并查询该属性类型。在我们例子中,它允许我们使用serialize方法(如果可用),否则返回到更通用方法str。功能强大,不是吗?...根据名称找出所有适用函数函数模板对于适用函数模板,要根据实际情况对模板形参进行替换; 替换过程中如果发生错误,这个模板会被丢弃 在上面两步生成可行函数集合中,编译器会寻找一个最佳匹配,产生对该函数调用...如果没有找到最佳匹配,或者找到多个匹配程度相当函数,则编译器需要报错。...现在,auto可以用于函数方法返回类型

2.9K20

C++11:unique_ptr 自己定义类似make_sharedmake_unique模板函数

C++11中智能指针分为共享型shared_ptr和独占型unique_ptr,C++11提供了make_shared函数来创建shared_ptr指针,使用起来更方便,有了make_shared...但是unique_ptr却不同,unique_ptr不像shared_ptr可以通过make_shared方法来创建智能指针,C++11目前还没有提供make_unique函数,在C++14中才会提供make_shared...方法类似的make_unique来创建unique_ptr. make_unique实现 其实要实现make_unique函数并不复杂,创建普通对象指针代码如下: #include <type_traits...用到了名为std::enable_iftype_traits,它类似一个if语句,判断ZERO,当ZERO为true时编译器选择第一个版本函数,反之选择第二个。....) = delete; 对这么简单函数VS2015不可能写一个与标准不兼容,所以如果考虑到与未来C++14兼容性,应该使用这个版本。 参照msvc版本代码修改如下: #if !

1.1K20

【C++11】消除重复, 提升代码质量---type_tratis

使用方法也很简单,派生integral_constant类后,则不用再新增定义类型和枚举变量。...type_traits从integral_constant派生而来,使用这些方法可以在编译期判断数据类型,常用类型判断类型有:is_const,is_void,is_union,is_class等等...; 使用后置推导类型时,如果没有构造函数导致编译报错问题; std::result_of原型如下: template struct result_of; 第一个模板参数为可调用对象类型,第二个参数为参数类型使用方法如下: int fn(int) {return...使用std::enable_if可以实现一个强大重载机制,充分利用可以减少或者消除圈复杂度。如:根据不同数据基本类型转换为string进行输出。

1.6K10

C++核心准则T.48:如果你编译器不支持concepts,使用enable_if模仿它

T.48: If your compiler does not support concepts, fake them with enable_if T.48:如果你编译器不支持concepts,使用...因为这是不能活动concept直接支持时可以采用最佳做法。enable_if可以用于有条件定义函数并从一组函数中进行选择。...使用enable_if模拟概念重载有时会要求我们使用容易出错设计技术。 Enforcement(实施建议) ??...这样一方面可以使读者了解真实软件开发工作中每个设计模式运用场景和想要解决问题;另一方面通过对这些问题解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式利弊,并合理运用设计模式。...对设计模式感兴趣而且希望随学随用读者通过本书可以快速跨越从理解到运用门槛;希望学习Python GUI 编程读者可以将本书中示例作为设计和开发参考;使用Python 语言进行图像分析、数据处理工作读者可以直接以本书中示例为基础

43930

利用numba給Python代码加速

nopython编译模式行为本质上是编译修饰后函数,使其完全运行而不需要Python解释器参与。这是使用Numba jit装饰器推荐和最佳实践方法,因为它可以获得最佳性能。...在这种模式下,Numba将识别可以编译循环,并将这些循环编译成在机器代码中运行函数,它将在Python解释器中运行其余代码(速度变慢)。为获得最佳性能,请避免使用此模式!...使用释放GIL运行代码可与执行Python或Numba代码其他线程(同一个编译函数或另一个编译函数)同时运行,允许您利用多核系统。如果函数是在对象模式下编译,则这是不可能。...Numba将在调用时推断参数类型,并基于此信息生成优化代码。Numba还可以根据输入类型编译单独专门化。...在这种情况下,相应专门化 将由@jit decorator编译,不允许其他专门化。如果您希望对编译器选 择类型进行精确控制(例如,使用单精度浮点),这将非常有用(通 常会更快)。

1.5K10

C++11:模板实现opencl向量类型简单运算符重载及length,distance函数

opencl内核支持所有向量数据类型(intn,floatn,doublen….)在主机端都有对应类型,区别是加了前缀cl_,比如int4对应主机端类型是cl_int4。...+,-运算,支持两个向量类型数据加/减运算,以及一个向量和一个标量类型加/减运算,以及legnth,distance函数。...(实现其他运算符和函数也是差不多代码,因为我暂时不需要就没有继续写下去)。...代码开始有两个很长模板函数cl_vector_type和is_cl_vector,所有的其他函数模板都要用到这两个模板函数: cl_vector_type用于构造一个指定元素类型和长度opencl...有了这些模板函数支持,主机端opencl向量运算就变得像在内核代码中一样简单,还以前面的例子用模板函数重写,就是这样: cl_int4 p1={4,2,0,9}; cl_int4 p2={3,9,-

1.7K10

性能优化利器之constexpr

从概念上理解的话,constexpr即常量表达式,重点在表达式字段,用于指定变量或函数可以在常量表达式中使用,可以(或者说一定)在编译时求值表达式,而const则为了约束变量访问控制,表示运行时不可以直接被修改...if语句 如果您目前使用C++11进行编码,那么需要仔细阅读本节,这样可以为将来版本升级打好基础;如果您正在使用C++17进行编码,那么更得阅读本节,相信读完本节后,会有一个不一样认识。...如果有个需求,实现一个Add函数,其既支持算术类型又支持用户自定义类型: template struct Number { Number(const T& _val)...在上述代码中,为了编译成功,我们引入了两个Square()模板函数借助std::enable_if来实现,代码上多少有点冗余,在这个时候,本节主角if constexpr 出场,完整代码如下: #include...我们借助一个Square()函数模板以及更加符合编码习惯if语句就能解决上面的问题,且比使用std::enable_if方式更为优雅和符合阅读习惯,进而提高代码可阅读性。

33510

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

它可以与函数模板、类模板和模板别名一起使用enable_if通过在函数模板返回类型使用模板参数作为条件来工作。...当条件为true时,返回类型有效并启用函数模板; 当条件为false时,enable_if会导致编译器选择其他重载或者删除该函数模板。...enable if 是一个模板元编程工具,使用 typename std::enable_if::type 形式将其应用于模板参数或函数返回类型。...它用于在编译时基于类型或条件启用或禁用函数模板。 应用范围: constexpr if 可以在任何函数使用,包括普通函数和模板函数。...它允许对常量表达式进行静态分支,并且可以在编译时决定不同代码路径。 enable if 通常与模板函数一起使用,用于在编译时根据类型或条件启用或禁用特定模板函数

25530

属性“__attribute__”在Objective-C中应用

首先,__attribute__用于在函数,变量或类型声明时进行特殊属性设置编译器指令。需要注意,它是一种编译器指令,这也就表明了使用它我们可以做更高级检查与优化功能。...__attribute__根据其修饰场景不同可以分为3种类型,分别为函数属性,变量属性和类型属性。...5. const       const属性是一种编译优化功能,其可以将某个函数指定为const类型,这时会将函数返回值当做const变量来使用,这时如果没有使用到返回值,则函数本身会被优化,避免执行造成额外性能消耗...在实际编程中,很多时候,都是由于子类重写了父类方法造成不可预知问题,通过使用这个属性可以有效对开发者进行提示,例如: ?...9. enable_if       enable_if提供了一种方式对函数参数进行校验,不满足校验规则参数传递将在编译时报错,使得函数使用更加安全,例如: ?

2.2K20

C++ enable_shared_from_this 具体实现

_NOEXCEPT {} }; 我们可以注意到在 shared_ptr 构造函数里,会调用 __enable_weak_this() 这样一个方法,有两个参数,把包装裸指针 __p 传入进去 _..._enable_weak_this 函数主实现使用了模版源编程 Template meta programming,不熟悉的话,可能乍一看有点蒙,这个稍后再说,先看函数体: __enable_weak_this...这个就需要我们回过头来看 __enable_weak_this 返回值类型,也就是下面这一坨: typename enable_if< is_convertible<_OrigPtr..._NOEXCEPT {} 对于第一个问题,就是 enable_if作用: enable_if::type 意思是说,如果bool值为true,enable_if 返回就是第二个模版参数...所以这句话意思就是说,如果传入裸指针类型是继承自 enable_shared_from_this ,那么 返回 void 类型,否则返回空,让 __enable_weak_this 函数替换失败

93130

碾压 Python!为什么 Julia 速度这么快?

这里使用了多重分派:“*” 操作符根据它看到类型调用不同方法。例如,当它看到浮点数时,就会返回浮点数。Julia 提供了代码自省宏,可以看到代码被编译成什么东西。...但是,如果编译器在调用 “*” 之前能够知道 a 和 b 类型,那么它就知道应该使用哪个 “*” 方法,这样它就知道 c=a*b 输出类型是什么。...其次,需要通过多重分派来专门化类型函数,让脚本语言语法 “看上去更显式” 一些。最后,需要一个健壮类型系统。为了构建非类型稳定乘方运算,我们需要使用转换函数。...在很多情况下,你会发现你可以从一开始就使用不同类型,以此来实现类型稳定性(为什么不直接使用 2.0^-5?)。但是,在某些情况下,你找不到合适类型。...这就导致了一个通用设计原则:在处理奇怪或非严格类型时,可以使用一个外部函数来处理逻辑类型,同时使用一个内部函数来处理计算任务,实现最佳性能,同时仍然具备脚本语言通用能力。

2.3K10

与 Python 之父聊天:更快 Python!

大多数其它聚焦于 Python 性能方法,如 PyPy 和 Cinder,并不适用于所有的使用场景,因为它们不能向后兼容扩展模块。...如果有某些函数被多次执行,那么我们就称其为 hot 函数。“hot”存在多种定义。在某些情况下,如果一个函数被调用超过一次,或者超过两次,或者超过 10 次,那么它被定义成一个热门函数。...然后,当参数类型某些特定类型时,专门化自适应编译器(PEP-659 Specializing Adaptive Compiler)会尝试用更快字节码来替换某些字节码。...因此,优化方法就是提供一个单独“两个整数相加”字节码,它是一个对用户隐藏第二层字节码。...(“优化”通常被称为加速 quickening,但一般在我们语境中,我们称之为专门化 specializing)。

54900

opencl:cl::make_kernel进化

于是利用C++11变长模板特性,我们可以写出下面的run_kernel模板函数 template<typename IN_CL_TYPE // kernel参数中输入数据类型(cl::Buffer...我们看上面这个run_kernel函数,它对kernel函数参数类型和顺序是有要求: 第一个参数必须是输入数据对象 第二个参数必须是输出数据对象 其他标量数据对象必须位于第三位以后 所以,它使用是有限制...>(args)...); 等等, 这upload_args_if_need和download_args是个模板函数啊, 嗯,在这里用了递归模板函数,循环检查args 参数表中参数类型,如果是memory_cl...;//递归处理其他参数 } // 参数ARG为非memory_cl类型时,为空函数,啥也不做直接返回 template typename std::enable_if...它带来好处是当你项目中有很多不同kernel函数要执行时,使用这种设计方式可以大大减少撰写重复或相似的代码,同时增加代码稳定性。

1.4K20

C++11 JNI开发中RAII应用(一)--制作基础工具

我的确要在native code中频繁创建对象,创建array of object ,还可能会调用java对象中方法返回也是java object,。。。。...//这里->操作符使用函数模板实现,用到了is_pointer和is_class两个type_trait来判断T类型, //如果T不是指针,也不是class/struct,则没有->操作符实现 同样为了方便调用...,还增加了支持类型转换模板函数_get(),允许指定返回类型调用_get(),比如 raii_obj...._get(),调用_get()时将raii_obj中对象转成jstring类型 /* 根据 _T类型不同选择不同函数模板 */ template<typename...JNIEnv函数还是需要提供JNIEnv*这个参数,所以针对JNIEnv方法,再封装一个更简便调用raii_jobject_env,用这个方法调用JNIEnv函数,就不用再提供JNIEnv*参数了

36210

ASP.NET5 中静态文件各种使用方式服务端静态文件开启目录浏览呈现默认文件使用UseFileServer方法文件类型基于IIS考虑最佳实践

假如你知识这样简单调用了UseDefaultFiles方法并且使用一个目录Url进行访问,那么这个中间件将会搜索下列中一个文件,假如他们中有一个被找到,那么这个文件将会作为默认文件被展示: default.htm...你可以调用UseStaticFiles和UseDefaultFiles方法,并且给这两个方法传入相同值,然后我们更推荐使用下文中将讲述UseFileServer方法。...使用UseFileServer方法 作为对UseStaticFiles、UseDefaultFiles和UseDirectoryBrowser方法补充,有一个UseFileServer方法集合前三个方法功能为一身...使用这样目录结构,你可以通过上文中所述方法开启目录浏览和静态文件访问功能,你可以通过http://localtion/images 目录看到test.image文件,但是当你点击这个文件,你将收到一个...app.RunIISPipeline(); } 最佳实践 代码文件应该被置于应用程序webroot目录以外,这样可以建立静态文件和源代码完全隔离。

1.9K80
领券