广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C++11中模板的优化问题
  • 560
分享到

详解C++11中模板的优化问题

2024-04-02 19:04:59 560人浏览 独家记忆
摘要

1. 模板的右尖括号 在泛型编程中,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符,而不是模板参数表的结束。我们先来看一段关

1. 模板的右尖括号

在泛型编程中,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符,而不是模板参数表的结束。我们先来看一段关于容器遍历的代码,在创建的类模板 Base 中提供了遍历容器的操作函数 traversal():


// test.cpp
#include <iOStream>
#include <vector>
using namespace std;

template <typename T>
class Base
{
public:
    void traversal(T& t)
    {
        auto it = t.begin();
        for (; it != t.end(); ++it)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
};


int main()
{
    vector<int> v{ 1,2,3,4,5,6,7,8,9 };
    Base<vector<int>> b;
    b.traversal(v);

    return 0;
}

如果使用 c++98/03 标准来编译上边的这段代码,就会得到如下的错误提示:

test.cpp:25:20: error: '>>' should be '> >' within a nested template argument list
Base<vector<int>> b;

根据错误提示中描述模板的两个右尖括之间需要添加空格,这样写起来就非常的麻烦,C++11改进了编译器的解析规则,尽可能地将多个右尖括号(>)解析成模板参数结束符,方便我们编写模板相关的代码。

上面的这段代码,在支持 C++11 的编译器中编译是没有任何问题的,如果使用 g++ 直接编译需要加参数 -std=c++11

2. 默认模板参数

在 C++98/03 标准中,类模板可以有默认的模板参数:


#include <iostream>
using namespace std;

template <typename T = int, T t = 520>
class Test
{
public:
    void print()
    {
        cout << "current value: " << t << endl;
    }
};

int main()
{
    Test<> t;
    t.print();

    Test<int, 1024> t1;
    t1.print();

    return 0;
}

但是不支持函数的默认模板参数,在C++11中添加了对函数模板默认参数的支持:


#include <iostream>
using namespace std;

template <typename T = int, T t = 520>
class Test
{
public:
    void print()
    {
        cout << "current value: " << t << endl;
    }
};

int main()
{
    Test<> t;
    t.print();

    Test<int, 1024> t1;
    t1.print();

    return 0;
}

通过上面的例子可以得到如下结论:当所有模板参数都有默认参数时,函数模板的调用如同一个普通函数。但对于类模板而言,哪怕所有参数都有默认参数,在使用时也必须在模板名后跟随 <> 来实例化。

另外:函数模板的默认模板参数在使用规则上和其他的默认参数也有一些不同,它没有必须写在参数表最后的限制。这样当默认模板参数和模板参数自动推导结合起来时,书写就显得非常灵活了。我们可以指定函数模板中的一部分模板参数使用默认参数,另一部分使用自动推导,比如下面的例子:


#include <iostream>
#include <string>
using namespace std;

template <typename R = int, typename N>
R func(N arg)
{
    return arg;
}

int main()
{
    auto ret1 = func(520);
    cout << "return value-1: " << ret1 << endl;

    auto ret2 = func<double>(52.134);
    cout << "return value-2: " << ret2 << endl;

    auto ret3 = func<int>(52.134);
    cout << "return value-3: " << ret3 << endl;

    auto ret4 = func<char, int>(100);
    cout << "return value-4: " << ret4 << endl;

    return 0;
}

测试代码输出的结果为:

return value-1: 520
return value-2: 52.134
return value-3: 52
return value-4: d

根据得到的日志输出,分析一下示例代码中调用的模板函数:

auto ret = func(520);
函数返回值类型使用了默认的模板参数,函数的参数类型是自动推导出来的为 int 类型。
auto ret1 = func<double>(52.134);
函数的返回值指定为 double 类型,函数参数是通过实参推导出来的,为 double 类型
auto ret3 = func<int>(52.134);
函数的返回值指定为 int 类型,函数参数是通过实参推导出来的,为 double 类型
auto ret4 = func<char, int>(100);
函数的参数为指定为 int 类型,函数返回值指定为 char 类型,不需要推导
当默认模板参数和模板参数自动推导同时使用时(优先级从高到低):

如果可以推导出参数类型则使用推导出的类型
如果函数模板无法推导出参数类型,那么编译器会使用默认模板参数
如果无法推导出模板参数类型并且没有设置默认模板参数,编译器就会报错。
看一下下面的例子:


#include <iostream>
#include <string>
using namespace std;

// 函数模板定义
template <typename T, typename U = char>
void func(T arg1 = 100, U arg2 = 100)
{
    cout << "arg1: " << arg1 << ", arg2: " << arg2 << endl;
}

int main()
{
    // 模板函数调用
    func('a');
    func(97, 'a');
    // func(); //编译报错
    return 0;
}

程序输出的结果为:

arg1: a, arg2: d
arg1: 97, arg2: a

分析一下调用的模板函数 func():

func('a'):参数 T 被自动推导为 char 类型,U 使用的默认模板参数为 char 类型
func(97, 'a');:参数 T 被自动推导为 int 类型,U 使用推导出的类型为 char
func();:参数 T 没有指定默认模板类型,并且无法自动推导,编译器会直接报错
模板参数类型的自动推导是根据模板函数调用时指定的实参进行推断的,没有实参则无法推导
模板参数类型的自动推导不会参考函数模板中指定的默认参数。

到此这篇关于详解C++11中模板的优化问题的文章就介绍到这了,更多相关C++11模板优化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解C++11中模板的优化问题

本文链接: https://www.lsjlt.com/news/136417.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解C++11中模板的优化问题
    1. 模板的右尖括号 在泛型编程中,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符,而不是模板参数表的结束。我们先来看一段关...
    99+
    2022-11-12
  • C++11中的变长模板的示例详解
    目录1.C99中的变长函数2.C++11中的变长函数3.详解变长模板3.1 更一般的SFINAE规则3.2 模板参数包的概念3.3 三个简单的例子3.4 函数参数包3.5 包扩展的进...
    99+
    2023-02-06
    C++11变长模板 C++ 变长模板 C++11 模板
  • C++中编译优化问题的详解
    C++中编译优化问题的详解编写高效的C++代码是每个程序员都追求的目标,而编译优化就是其中一个重要的方面。正确理解和应用编译优化可以极大地提高程序的性能和效率。本文将从C++编译优化的基本原理、常见的优化技术和具体的代码示例入手,详细解析C...
    99+
    2023-10-22
    C++编译优化问题
  • C++中常见的代码优化问题详解
    C++中常见的代码优化问题详解引言:随着计算机技术的不断发展,提高代码的性能成为了程序员们的首要任务之一。对于C++这一高级编程语言来说,代码优化是非常重要的一环。本篇文章将详细介绍C++中常见的代码优化问题,并给出具体的代码示例。一、避免...
    99+
    2023-10-22
    代码 优化 C++
  • C++中算法优化问题详细解析
    C++中算法优化问题详细解析引言:在编程领域中,算法的优化是一项非常重要的工作。一个高效的算法可以有效地节省时间和空间资源,提高程序的性能。C++作为一种高级编程语言,提供了丰富的工具和技术来优化算法。本文将详细解析C++中算法优化的问题,...
    99+
    2023-10-22
    C++ 算法优化 问题解析
  • C++11中模板隐式实例化与显式实例化的定义详解分析
    目录1. 隐式实例化2. 显式实例化声明与定义3. 显式实例化的用途1. 隐式实例化 在代码中实际使用模板类构造对象或者调用模板函数时,编译器会根据调用者传给模板的实参进行模板类型推...
    99+
    2022-11-13
  • C++中编译优化问题和解决方法的详解
    C++中编译优化问题和解决方法的详解摘要:C++编译器优化是提高程序性能的重要手段。然而,在实际开发中,我们经常会遇到一些与编译优化相关的问题,比如编译器错误优化、代码性能下降等。本文将针对这些问题进行详细的解析,并提供相应的解决方法,以期...
    99+
    2023-10-22
    问题解决方法 C++编译优化 详解编程关键词
  • C++模板编程中遇到的问题及解决方法
    C++模板编程中遇到的问题及解决方法引言:C++的模板是一种强大而灵活的工具,可以在编写代码时实现泛型编程,提高代码的复用性和可扩展性。然而,随着项目的复杂性增加,我们可能会遇到一些常见的问题。本文将讨论这些问题,并提供解决方法和具体的代码...
    99+
    2023-10-22
    问题一:特化(Specialization) 问题二:递归(Recursion) 问题三:编译时检查(Compile-t
  • C++访问者模式模板函数无法重载的问题解决
    目录背景 解决方案 最终代码 背景 最近遇到一个比较棘手的场景,我们有一堆模块,他们有一个通用的基类,我们不防假设为 BaseClass,该类有一些通用的结构以及需要重载的方法。这...
    99+
    2022-11-12
  • 详解c++中的trait与policy模板技术
    目录概述trait模板技术用模板参数来传递多种traitpolicy模板技术模板化的policytrait模板与policy模板技术的比较概述 我们知道,类有属性(即数据)和操作两个...
    99+
    2022-11-12
  • 详解Django模板层过滤器和继承的问题
    过滤器 模板层对变量的操作实际还有很多,过滤器就是其中一种。学过Linux系统的一定知道管道操作符,其可以将上一步输出直接作为下一步输入进行处理,这里的过滤器就是类似管道符,其写法也...
    99+
    2022-11-12
  • 如何解决C++访问者模式模板函数无法重载的问题
    本篇内容主要讲解“如何解决C++访问者模式模板函数无法重载的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决C++访问者模式模板函数无法重载的问题”吧!背景最近遇到一个比较棘手的场景,...
    99+
    2023-06-22
  • C++中的指针问题及引用问题详解
    C++中的指针问题及引用问题详解在C++编程中,指针和引用是两个非常重要的概念。它们可以用于对变量进行间接访问,提高程序的灵活性和效率。然而,指针和引用也容易导致一些问题,本文将详细探讨这些问题,并提供具体的代码示例。指针问题:空指针访问:...
    99+
    2023-10-22
    指针问题(Pointers) 引用问题(References) C++编程(C++ programming)
  • C++中常见的编译优化问题解决方案
    C++中常见的编译优化问题解决方案摘要:在使用C++编写程序时,我们经常会遇到一些性能瓶颈,影响程序的运行效率。为了提高代码的执行效率,我们可以使用编译器进行优化。本文将介绍一些常见的编译优化问题及其解决方案,并给出具体的代码示例。一、循环...
    99+
    2023-10-22
    内联优化 (Inlining Optimization) 循环展开优化 (Loop Unrolling Optimiza
  • 详解C++中函数模板的定义与使用
    目录1. 前言2. 初识函数模板2.1 语法2.2 实例化2.3 实参推导3. 重载函数模板1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板。 如果现在...
    99+
    2022-11-13
  • C++中的类型推断问题详解
    C++中的类型推断问题详解在C++编程中,类型推断是指编译器根据代码的上下文环境自动推断变量的数据类型。它可以使代码更加简洁、易读,并减少了程序员的工作量。然而,类型推断也可能带来一些问题,本文将详细介绍这些问题,并提供具体的代码示例。自动...
    99+
    2023-10-22
    类型推断 (type inference) C++语言 (C++ Language) 问题详解 (Problem Ana
  • C++中代码优化问题的分析与解决方法
    C++中代码优化问题的分析与解决方法摘要:在进行C++程序开发时,我们常常需要关注代码的性能优化。本文将介绍一些常见的代码优化问题,并提供相应的解决方法和具体代码示例,旨在帮助读者提高C++程序的执行效率。内存管理问题内存管理是代码优化中一...
    99+
    2023-10-22
    内存管理 (Memory management) 并发编程 (concurrent programming) 优化算法
  • C++中代码优化问题的分析与解决方案
    C++中代码优化问题的分析与解决方案在C++编程中,代码优化是一个重要的方面。优化代码可以使程序执行效率更高,运行速度更快,并减少资源的占用。本文将探讨一些常见的代码优化问题,并提供相应的解决方案和具体的代码示例。避免频繁的内存分配与释放在...
    99+
    2023-10-22
    优化策略 (Optimization strategy) 性能分析 (Performance Analysis) 微优化
  • C++中编译优化问题及解决方法概述
    C++中编译优化问题及解决方法概述引言:编译优化是在编译过程中对代码进行优化的一种技术。优化可以提高程序的执行效率、减少内存占用以及降低功耗。然而,虽然编译器在编译过程中会尽力优化代码,但在某些特定情况下,编译器可能无法进行有效的优化,从而...
    99+
    2023-10-22
    问题解决 C++编译优化 方法概述
  • C++中的多线程同步问题详解
    C++中的多线程同步问题详解在并发编程中,多线程同步是一个重要的问题。当多个线程同时访问共享资源时,会引发各种问题,如竞态条件(Race Condition)、死锁(Deadlock)和活锁(Livock),这些问题都会导致程序的不确定性和...
    99+
    2023-10-22
    C++ 多线程 同步问题
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作