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

C++模板函数参数类型返回类型方法

参考链接: C++编程默认参数(参数) 假设要利用模板元编程获取位于index参数类型:  template struct ArgTypeAt...{     // FuntionType返回类型参数类型?...  这时FunctionType就是一个单独类型int(int, short, float)了,里面含有各参数类型。...要把FuntionType分离成返回类型参数类型,方法是利用模板特化,然后参数类型是一个包,再把参数包展开就能得到各位置参数类型:  template<int index, class FuntionType...(默认是__cdecl)改成__stdcall这个模板特化就不匹配了,因为修饰符也是类型一部分,C++泛型并没有修饰符变了还能匹配方法(只有类型变了能匹配)。

4K50

C++函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入参数要求 | 参数返回值 )

指针与引用类型参数 II . 指针作为参数返回值 III . 引用参数简介 IV . 引用作为参数返回值 I . 博客总结 . 指针与引用类型参数 ---- 1 ....参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境中 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用都是指针类型参数...C 语言中参数 分类 : ① 普通变量参数 : C 语言中 普通变量 ( 非指针变量 ) 作为参数 , 只能进行值传递 , 不能通过参数返回结果 ; ② 指针变量参数 : C 语言中 , 如果要让函数参数可以将结果返回...C++引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数情况 , 使参数具有返回结果能力 ; 3 ....引用作为参数返回值 ---- 引用作为参数返回值 : 如果是引用作为参数 , 修改 N 维指针指向地址 , 那么需要传入 N 维指针引用即可 ,在函数中修改该引用 , 即可修改外部被引用变量

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

C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体类型参数列表 | 继承 类模板 必须重写构造函数 )

子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小..., 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体 类型参数列表 数据类型 ; 此时 , 在继承时 , 被继承模板 必须 声明 类型参数列表 , 将具体泛型类型写在尖括号中..., 调用 类模板 具体类 构造函数 , 如果 子类 继承 类模板父类 , 如果 子类没有实现 构造函数 , // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表...继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存...继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存

54230

C++核心准则编译边学-F.19 对于只传递处理参数,使用模板类型TP&&并在传递时使用std::forward

F.19: For "forward" parameters, pass by TP&& and only std::forward the parameter(对于只传递处理参数,使用模板类型TP...return s } 右值引用作为参数类型使用时候,首先被实参初始化,结果是实参将无效化(右值引用定义)。...在这种情况下,也只有在这种(右值引用参数只传递不使用)情况下,将TP参数定义为TP&&(这里TP是模板类型)--这样可以无视并维持常量特性和右值特性。...TP&&类型参数本质上总是应该在函数体中通过std::forward继续传递。 译者注:最终还是要被某段代码作为左值使用。...在下面情况下发出警示:对于函数使用TP&&类型参数(这里TP是模板类型参数名),除了在所有静态路径上精确地执行一次std::forward操作以外执行了任何(针对改参数)其他处理。

1.1K00

C++核心准则C.60: 拷贝赋值运算符应该是以const&为参数返回非常量引用类型非虚函数

返回非常量引用类型非虚函数 Reason(原因) It is simple and efficient....实现交换函数(参考C.83)技术提供了(不会发生自拷贝,译者注)强有力保证。...通过将数据直接写入对象元素,我们可以得到基本保证不是通过swap技术提供强保证。为了防止自己给自己赋值。...(简单)赋值运算符应该返回T&,这样才能实现连续赋值。不要改成类似const T&类型,这样会影响组装性并妨碍将对象放进容器中。...(中等)赋值运算符应该(隐式或显式)调用所有的基类和成员赋值运算符。观察析构函数以决定这个类型式指针语义还是值语义。

79630

C++ 特性使用建议

右值引用是一种只能绑定到临时对象引用一种,语法与传统引用语法相似,例如void f(string&& s); 声明了一个参数是一个字符串右值引用函数。...例如,如果v1 是一个vector,则auto v2(std::move(v1))将很可能不再进行大量数据复制只是简单地进行指针操作,在某些情况下这将带来大幅度性能提升。...例如,用 AppendString() 和 AppendInt() 等,不是一口气重载多个Append()。 4.缺省参数 建议使用缺省函数参数,尽可能改用函数重载。...,只要可读性好就继续用,但别用在局部变量之外地方,比如声明头文件里一个常量,那么只要仅仅因为程序员一时修改导致类型变化的话,API 要翻天覆地了。...如果你使用递归模板实例化,或者类型列表,或者元函数,又或者表达式模板,或者依赖SFINAE,或者sizeof trick 手段来检查函数是否重载,那么这说明你模板太多了,这些模板太复杂了,我们推荐使用

1.6K20

《Effective C++》学习笔记

参数返回类型等。...对于一些可能在被别的类直接调用成员函数、值类,最好改为暴露一个返回类对象引用函数形式,不是暴露类对象本身,这可以保证在函数内完成初始化,避免被调用时还没有初始化。...条款21:必须返回对象时,别妄想返回引用 虽然函数参数最好用引用值,但函数返回值却不要随便去用引用,这回造成很多问题,比如引用对象在函数结束后即被销毁,或是需要付出很多成本和代码来保证不被销毁且不重复...条款29:为异常安全努力是值得 异常安全函数是指即使发生异常也不会泄露资源或者导致数据结构破坏,分三种保证程度:基本保证、强烈保证和抛异常型。 只有基本类型才确保了抛异常型。...因类型参数造成代码膨胀(比如int和long有相同二进制表述,但作为模板参数会产生两份代码),往往可降低,做法是让带有完全相同二进制表述具体类型共享实现码——使用唯一一份底层实现。

1.1K20

C++特性使用建议

右值引用是一种只能绑定到临时对象引用一种,语法与传统引用语法相似,例如void f(string&& s);声明了一个参数是一个字符串右值引用函数。...例如,如果v1 是一个vector,则auto v2(std::move(v1))将很可能不再进行大量数据复制只是简单地进行指针操作,在某些情况下这将带来大幅度性能提升。...std::move是无条件转换为右值,std::forward是有条件转换为右值,只会将绑在右值上参数转换为右值,起到转发一个参数给到另一个函数保持原来左值性质或者右值性质。...例如,用 AppendString() 和 AppendInt() 等,不是一口气重载多个Append()。 4.缺省参数 建议使用缺省函数参数,尽可能改用函数重载。...如果你使用递归模板实例化,或者类型列表,或者元函数,又或者表达式模板,或者依赖SFINAE,或者sizeof trick 手段来检查函数是否重载,那么这说明你模板太多了,这些模板太复杂了,我们推荐使用

1.9K30

Google C++ 编程风格指南(五):其他 C++ 特性

例如, 如果 v1 是一个 vector, 则 auto v2(std::move(v1)) 将很可能不再进行大量数据复制只是简单地进行指针操作, 在某些情况下这将带来大幅度性能提升...缺点: 如果函数单单靠不同参数类型重载(acgtyrant 注:这意味着参数数量不变),读者就得十分熟悉 C++ 五花八门匹配规则,以了解匹配过程具体到底如何。...即在一个现有函数添加缺省参数,就会改变它类型,那么调用地址代码可能会出错,不过函数重载就没这问题了。...引入异常使得 C++ 与 Python, Java 以及其它类 C++ 语言更一脉相承。 有些第三方 C++ 库依赖异常,禁用异常就不好用了。 异常是处理构造函数失败唯一途径。...如果您代码涉及容器返回大小(size),确保类型足以应付容器各种可能用法。拿不准时,类型越大越好。

1.1K30

Effective C++: 改善程序与设计55个具体做法

const可被施加于任何作用域内对象、函数参数函数返回类型、成员函数本体。...条款12:复制对象时勿忘每一个成分 请记住 ■ Copying函数应该确保复制“对象内所有成员变量”及“所有base class成分”。...条款37:绝不重新定义继承而来缺省参数值 请记住 ■ 绝对不要重新定义一个继承而来缺省参数值,因为缺省参数值都是静态绑定,virtual函数——你唯一应该覆写东西——却是动态绑定。...■ 因非类型模板参数(non-type template parameters)造成代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数。...条款46:需要类型转换时请为模板定义非成员函数 请记住 ■ 当我们编写一个class template,它所提供之“与此template相关函数支持“所有参数之隐式类型转换”时,请将那些函数定义为

65620

【笔记】《Effective C++》条款1-25

: C语言: C++基础结构 面向对象部分: C++创造时目标 模板C++: 为了支持泛型编程创建语法, 并实现了模板元编程(TMP)这种奇技淫巧 标准模板库: 充分运用了模板C++编写程序库...inline模板函数来代替, 通过模板操作我们可以让函数接收任何类型值, 且获得各种提前检测和访问控制....改善C++效率一大方法就是以const引用方式传递参数 C++const函数不可以更改对象内非static变量, 但是依然可以从指针修改内容, 要小心 有些时候我们希望写一个const函数但是令其在某些特殊时候能修改某些变量...如果拷贝构造是以值形式传入参数的话, 还可以直接将当前对象数据与传值进入对象进行交换 12 复制对象时勿忘每一个成分 当你选择实现自己拷贝构造函数时, 一定要手动复制所有的局部变量, 同时调用所有基类合适拷贝函数...24 若所有参数皆需类型转换, 请为此采用non-member函数 只有当参数被列于参数列中时, 这个参数才能参与隐式类型转换(*this不算在内) 当一个函数所有参数都需要进行类型转换时(时常发生在运算符重载函数

98730

《Effective C++》读书摘要

十、operator=返回*this引用 允许连续赋值。 十一、operator=处理自我赋值 注意资源释放顺序。 十二、复制对象要面面俱到 不要丢失基类成员复制。...二十、常引用参数代替值传递 前者高效,但是对于内置类型除外。 二十一、需要返回对象时候不要返回引用 栈、堆、静态对象都不要作为引用返回。...二十三、用非成员函数和非友元函数替换成员函数 封装强度和改变强度成反比,因为只影响有限用户; 类外访问函数封装性好于累内成员函数封装性,增加累内私有数据访问函数数量; 二十四、参数需要类型转换应使用非成员函数...四十四、参数无关代码抽离模板 将与模板无关类型参数转移到类内; 尽量降低与模板无关类型参数膨胀度。...现在就可以把doAdvance封装起来自动完成编译期类型判断。 四十八、模板元编程 让某些事情变得容易可能,将某些工作从运行期转移到编译期; 分支——借由模板特化实现; 循环——借由递归完成; ?

1.9K60

Effective C++笔记

复制对象时勿忘每一个成分 Copying函数应该确保复制“对象内所有成员变量”以及“所有base class成分” 不要尝试以某个copying函数实现另一个copying函数。...必须返回对象时,别妄想返回reference 22....将与参数无关代码抽离templates Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀template参数产生相依关系 因非类型模板参数造成代码膨胀...,往往可消除,做法是以函数参数或class成员变量替换template参数类型参数造成代码膨胀,往往可降低,做法是让带有完全相同二进制表述具现类型共享实现码 45....需要类型转换时请为模板定义非成员函数 当我们编写一个class template,它所提供“与此template相关函数支持“所有参数隐式类型转换”时,请将那些函数定义为“class template

79920

STL小结

STL又被添加进了C++库。1996年,惠普公司又免费公开了STL,为STL推广做了很大贡献。STL提供了类型安全、高效易用特性STL无疑是最值得C++程序员骄傲部分。...而在STL里仿函数最常用就是作为函数参数,或者模板参数。...,使成唯一,并复制到他处 upper_bound() 上限 四、注意细节: 1、auto_ptr不能用new[]所生成array作为初值,因为释放内存时用是delete,不是delete[] 2、....用来向一个函数(或函数对象)绑定某些参数. bind返回值是一个函数对象....如果绑定类型是一个类成员函数或变量,那么第一个参数必须是对象或者对象指针。 仿函数参数: 任意 仿函数返回值        如果绑定函数返回绑定函数返回值。

82210

后台开发:核心技术与应用实践 -- C++

C++允许用同函数名定义多个函数,但这些函数必须参数个数不同或类型不同,这就是函数重载。...函数模板,实际上是建立一个通用函数函数类型和形参不具体指定,而用一个虚拟类型来代表,这个通用函数就是函数模板。...凡是函数体相同函数都可以用这个模板来代替,不用定义多个函数,实际使用时只需在模板中定义一次就可以了。在调用函数时,系统会根据实参类型来取代模板虚拟类型,从而实现不同函数功能。...对象一一对象实际占用空间大小 函数一一函数返回类型所占空间大小,且函数返回类型不能是 void C++编译系统在 32 位机器上为整型变量分配4Byte,为单精度浮点型变量分配 4Byte ,为字符型变量分配...,访问非静态成员。

1.3K10

【笔记】《Effective C++》条款26-55

但是即便如此返回诸如指针和引用handles仍然危险, 用户可能会因为返回了一个右值handle从而得到了一个空悬指针 29 为"异常安全"努力是值得 声称自己是异常安全函数需要向外提供以下三个保证之一...这也是前面 条款7 和 条款34 一种解释 37 绝不重新定义继承而来缺省参数值 虚函数是动态绑定, 但是函数缺省参数值却是静态绑定, 只与你填写这个缺省参数值时类型有关, 与指针指向实际类型无关..., 只和重载一样和名称与参数有关, 所以很容易二义 更复杂情况是下图"菱形继承": 菱形继承中, 对于不同基类都拥有的同名成员, C++默认会复制多份以供使用, 如果希望复制就应该使用虚继承,...是用来弥补C++缺少反射机制模板库, 目的是对使用类型进行一些基本信息提取....主要是模板部分比较奇怪, 使用了模板参数但却没有用到它, 这是为了利用模板具现化来为每个不同类具现化出实体互异复件.

88930

从零开始学C++模板(一):函数模板函数模板特化、重载函数模板、非模板函数重载

} 1、函数模板定义以关键字template开头 2、template之后中是函数模板参数列表 3、函数模板参数类型参数类型为class或typename template<class...6、模板参数作用域局限于函数模板范围内 (二)、函数模板使用 1、函数模板为所有的函数提供唯一一段函数代码,增强了函数设计通用性 2、使用函数模板方法是先说明函数模板,然后实例化成相应模板函数进行调用执行...const int&, const int&)     return 0; } 函数模板可以通过传递参数类型自动推导,查看是否有合适函数实例可用,模板则必须显式说明模板类型参数,这样才能实例化模板类实例...四、模板偏特化 模板偏特化是指需要根据模板某些但不是全部参数进行特化 (1) 类模板偏特化 例如c++标准库中类vector定义 template <class T, class ...,一个参数被绑定到bool类型另一个参数仍未绑定需要由用户指定。

1.8K00

C++(STL):26 ---关联式容器set用法

容器存储各个键值对,键和值完全相同,也就意味着它们类型相同,因此 set 容器类模板定义中,仅有第 1 个参数用于设定存储数据类型。...由于采用默认 std::less 规则,因此其内部存储 string 元素顺序如下所示: "hello world" "C++" "nodejs" 3) set 类模板中还提供了拷贝(复制...另外,C++ 11 标准还为 set 类模板新增了移动构造函数功能是实现创建新 set 容器同时,利用临时 set 容器为初始化。...显然,无论是调用复制构造函数还是调用拷贝构造函数,都必须保证这 2 个容器类型完全一致。...count(val) 在当前 set 容器中,查找值为 val 元素个数,并返回。注意,由于 set 容器中各元素值是唯一,因此该函数返回值最大为 1。

56110

C++11移动语义与右值引用

2.3 std::forward实现完美转发 完美转发(perfect forwarding)指在函数模板中,完全依照模板参数类型,将参数传递给函数模板中调用另外一个函数,如: template<typename...比如,当转发函数实参是类型X一个左值引用,那么模板参数被推导为X&,当转发函数实参是类型X一个右值引用的话,那么模板参数被推导为X&&类型。再结合引用折叠规则,就能确定出参数实际类型。...通过引用折叠规则保留参数原始类型,完美转发在破坏const属性前提下,将参数完美转发到目的函数中。...为了让我们自己定义类型支持移动操作,我们需要为定义移动构造函数和移动赋值运算符。这两个成员类似对应拷贝操作,即拷贝构造和赋值运算符,但它们从给定对象窃取资源不是拷贝资源。...移动赋值运算符: 移动赋值运算符类似于赋值运算符,进行是资源移动操作不是拷贝操作从而提高了程序性能,接收参数也是一个类对象右值引用。移动赋值运算符必须正确处理自赋值。

1K20

C++(STL):28 ---关联式容器map用法

> // 指定分配器对象类型 > class map; 可以看到,map 容器模板有 4 个参数,其中后 2 个参数都设有默认值。...创建C++ map容器几种方法 map 容器模板类中包含多种构造函数,因此创建 map 容器方式也有多种,下面就几种常用创建 map 容器方法,做一一讲解。...C++ 11 标准中,还为 map 容器增添了移动构造函数。当有临时 map 对象作为参数,传递给要初始化 map 容器时,此时就会调用移动构造函数。...int>newMap(disMap()); 注意,无论是调用复制构造函数还是调用拷贝构造函数,都必须保证这 2 个容器类型完全一致。...count(key) 在当前 map 容器中,查找键为 key 键值对个数并返回。注意,由于 map 容器中各键值对值是唯一,因此该函数返回值最大为 1。

1K20
领券