C++中函数模板(function template)返回值

函数模板的返回值也可以定义为模板参数(template parameter), 但是由于无法推导(deduce), 需要显式(explicit)指定;

由于显式指定的顺序是从左至右, 返回值参数尽量放在左面,其余函数参数可以通过传入实参(argument)进行推导;

也可以提供由其他参数推导出的返回值类型, 需要使用拖尾返回类型(trailing return type);

使用decltype()函数推导, 即"编译时定义的类型", 注意使用拖尾返回类型时, 前置需要"auto", 后面使用"->";

也可以使用类型转换模板(type transformation templates)修改返回值类型, 主要应用于模板元编程(template metaprogramming);

注意使用"typename"限定词, 表明是类型, 不是静态成员; 类型转换函数包含type成员, 表明类型;

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

代码如下:

/*
 * cppprimer.cpp
 *
 *  Created on: 2013.11.28
 *      Author: Caroline
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <vector>
#include <string>
#include <type_traits>
#include <typeinfo>  

using namespace std;  

/*需要显示定义返回类型*/
template <typename T1, typename T2, typename T3>
T1 sum (T2, T3)
{
    T2 i2; T3 i3;
    return static_cast<T1>(i2+i3);
}  

/*注意拖尾返回类型(trailing return type)前面需要加auto*/
template <typename It>
auto fcn(It beg, It end) -> decltype(*beg)
{
    return *beg;
}  

/*注意拖尾返回类型是值, 注意第二个typename, 表明为类型*/
template <typename It>
auto fcn2(It beg, It end) ->
    typename remove_reference<decltype(*beg)>::type
{
    return *beg;
}  

int main (void) {  

    std::cout << "The type of sum return : " <<
            typeid(sum<float>(2, 3)).name() << std::endl;  

    std::vector<int> vi = {1, 2, 3, 4, 5};
    std::vector<std::string> vs = {"girl", "lady"};  

    /*返回的是引用*/
    auto &i = fcn(vi.begin(), vi.end());
    auto &s = fcn(vs.begin(), vs.end());
    i = 12, s = "woman";  

    std::cout << "*vi.begin() = " << *vi.begin() << std::endl;
    std::cout << "*vs.begin() = " << *vs.begin() << std::endl;  

    /*返回的是值, 所以不能在使用&符号*/
    auto i2 = fcn2(vi.begin(), vi.end());
    auto s2 = fcn2(vs.begin(), vs.end());  

    std::cout << "i2 = " << i2 << std::endl;
    std::cout << "s2 = " << s2 << std::endl;  

    return 0;  

}

输出:

The type of sum return : f
*vi.begin() = 12
*vs.begin() = woman
i2 = 12
s2 = woman

作者:csdn博客 Spike_King

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, include
, return
, 模板函数
, 模板
, typename
, template
, 函数模板
, 类型
, decltype
, metaprogramming
, 返回类型
返回值类型
js template 模板函数、function函数返回值、arttemplate模板引擎、js template 模板引擎、stringtemplate 模板,以便于您获取更多的相关知识。

时间: 2024-09-09 07:15:30

C++中函数模板(function template)返回值的相关文章

C++中函数模板(function template) 详解

C++的模板(template)是泛型编程(generic programming)的基础; 面向对象编程 是 运行(run time)时 知道类型(type); 泛型编程 是编译(compilation) 知道类型; 函数模板(function template)包含模板参数列表(template parameter list); 每个参数类型之前必须包含关键字typename或class, 尽量使用typename, 表达意思更加明确; 非类型模板参数(Nontype Template Pa

C++中函数模板(function template) 的 重载(overload) 详解

函数模板(function template)重载, 即实例化特定的模板, 确定T的类型, 选择匹配度最高的一个; 需要注意传递的具体类型, 如传递的是"&s", 则表示"string* t = &s", 即实际匹配的类型为"string* t"; 当非函数模板和函数模板匹配度相同时, 优先选择非函数模板; 调用模板时, 一定要注意顺序, 或者提前声明, 以保证可以找到函数模板, 进行实例化; 具体参见代码注释, 代码如下: /*

C++中函数模板(function template) 的 推进(forward) 问题

函数模板在调用函数的时候, 由于实参(argument)转换形参(parameter)的时候, 会发生改变, 导致无法保留原实参的信息, 即推进(forward)问题; 主要包括: 引用和右值;引用, 即因为模板参数非引用, 导致复制操作, 无法提供引用类型;右值, 即因为模板参数只能转换为左值, 无法提供右值; 解决方法: 引用: 使用右值参数(T&& t), 可以保证传递引用不发生改变; 右值:使用右值参数, 再使用forward()函数(#include<utility>

C++中函数模板定制(function template specialization) 详解

函数模板定制可以解决特定的模板参数, 需要特定的函数方法去实现; 注意函数模板定制是实例化模板, 而不是模板的重载; 有非模板函数(nontemplate function)存在时, 当匹配度相同时, 优先使用非模板函数; 如比较(compare)函数, 比较字符串(char*)类型, 不能通过判断地址去比较, 应该使用strcmp()函数, 需要定制函数模板; 函数模板定制需要使用 "template<>", 空的尖括号表明 提供的模板实参支持原版本的所有模板形参; 代码

c++ 函数模板重载-关于c++中函数模板的重载问题

问题描述 关于c++中函数模板的重载问题 直接上代码(简单),enter code here template< class T > void test(T x){ cout<<x<<endl; } void test(int); int main(){ int x = 1; test(x); } 上述程序使用非模板函数对函数模板test进行重载:按照书中的说法-这个非模板函数可以只声明原型,然后借用模板中定义的函数体. 但是链接的时候找不到那个非模板函数的定义(使用的

PHP中mysqli_affected_rows作用行数返回值分析_php技巧

本文实例分析了PHP中mysqli_affected_rows作用行数返回值.分享给大家供大家参考.具体分析如下: mysqli中关于update操作影响的行数可以有两种返回形式: 1. 返回匹配的行数 2. 返回影响的行数 默认情况下mysqli_affected_rows返回的值为影响的行数,如果我们需要返回匹配的行数,可以使用mysqli_real_connect函数进行数据库连接的初始化,并在函数的flag参数位加上: MYSQLI_CLIENT_FOUND_ROWS return nu

link中不能定义构造函数的返回值?为什么构造函数没有返回值?

问题描述 link中不能定义构造函数的返回值?为什么构造函数没有返回值? link中不能定义构造函数的返回值?为什么构造函数没有返回值? 解决方案 构造函数只能返回这个类的实例,不能返回别的,所以不需要也不能定义返回值. 在IL层面,它对应一个叫ctor的函数.

ASP中获得Select Count语句返回值的方法

  这篇文章主要介绍了ASP中获得Select Count语句返回值的方法,一般用在统计数据时使用Select Count语句,以此一获得查询到的行数,需要的朋友可以参考下 我们一般统计数据库记录时会用到Select Count(*)语句,当我们使用SQL Server的查询分析器时,直接输入Select Count(*) From 表名即会统计出该表中有几条记录,可是我们用ASP来实现时该怎么返回值呢?即如何输出统计出来的记录总数呢?请接着往下看. 其实我们只要给SQL语句的查询结果取个别名即

vb中2005中如何获取messbox的返回值(要详细介绍)顺便推荐学vb2005的教程,谢谢各位了!

问题描述 vb中2005中如何获取messbox的返回值(要详细介绍)顺便推荐学vb2005的教程,谢谢各位了! 解决方案 解决方案二:Result=MessageBox()Result=Msgbox()解决方案三:笨蛋方法:dimaasinteger=msgbox("笨蛋方法",1,"大笨蛋")ifa=1then...ifa=2then...