C++学习笔记I

它真可爱。

本文仅供个人学习记录使用,其中大多文字逻辑不清,略有错误,望各位慎重阅读!

问题导向

1. 指针显示调用构造函数

这是不可能的,只能是
new Class(object);

2. std::tuple为什么能存类型?所谓的存类型又是什么?

    • make_tuple是如何自动推导类型的,推导的时机是编译时还是运行时?
    • make_tuple是如何做到接受任意个任意类型的?
    • 既然tuple没有下标,那么其内部结构是怎样的?在逻辑空间上是连续存储还是离散存储呢?
    • 如何静态地创建一个tuple对象并静态地获取其元素的值?
    • 如何静态地获取tuple元素的类型?
    • 想要进一步地使用好tuple,必须结合模板元编程

3. 模板必须要知道的东西

  • 函数模板-实参可提供自动推导的信息
template <typename T>
void simple_swap(T& a,T&b)
{
    T temp=a;
    a=b;
    b=temp;
}

int main(int argc, char* argv[])
{
    double a=10;
    double b=20;
    simple_swap<double>(a,b);
    simple_swap(a,b);
}
  • 类模板有没有这样的设定呢?
    C++17引入了CTAD(class template argument deduction)即类模板参数推导
  • 对象尚未存在,对应类的constexper成员函数即可执行
  • 类模板是类的生成器,函数模板是函数的生成器
  • 为什么不能头源分离?模板的处理先于链接,类和函数的实现也限制了模板是否能“实例化”

4. 进阶:模板特化

  • 模板匹配失败不是错误
    用于类型特性检测,是否支持+,是否有某个函数成员等

  • 函数模板全特化的匹配是否只是支持非构造的隐式转换?
    关键在于静态分析阶段,编译器认为这将是一个什么类型。

  • 函数模板-隐式类型转换给模板全特化带来的烦恼

    • 平凡转换和调用构造函数的隐式转换的本质不同是?(汇编学的好,这个问题没烦恼)
    • 部分字面量的类型较为模糊,如何确定?
      比如10,是int?还是short?还是size_t?
    • 调用构造的隐式转换-(存疑)为什么模板特化不做,函数重载却做了
  • const

    • 如何同时特化const int和int?
    • 重载能区分到多细?函数模板全特化能区分到多细?
  • 类模板全特化

    • 以template<>为全特化标志,同时以完整声明指明特化类型
    • 特化后的类是一个全新的类,与通用模板的类产生器产生的类没有联系
  • 偏特化

    • 偏特化使用的参数数量要少于或等于通用模板参数的数量?
  • 原始数组之间的赋值为指针,而不是copy

  • 坑爹的typename=void,如何理解带默认值的匿名模板参数?

    • enable_if<>
    • is_addable<>
    • std::void_t<>

5. 整合tuple与模板特化

  • std::tuple 是编译期异构容器,元素类型 / 数量由模板参数决定

  • 编译期拆解tuple,获得所有类型

    • 模板递归
  • 模板匹配时,由于函数实现导致的异常在编译时被发现还是在运行时被发现?

  • 模板递归

    • 本身与...无显示关联,只是自己的函数调用自身而已,再结合每次调用传参会变化,调用一次,编译器就会根据类生成器生成一个类,而生成的匹配规则又有特化这一点,所以只需要特化终止值即可,再使得终止类和非终止类的同一个函数的实现不同即可实现终止。
    • 那么该怎么终止呢?——停止调用就行
      https://www.doubao.com/thread/wa45b930bea912c15
  • 坑爹的静态变量初始化不递归

    • C++不保证静态成员变量初始化顺序
  • 类成员函数的模板

  1. iterator到底是什么,内部结构如何?
posted @ 2025-12-12 21:37  太想赢,你就输了  阅读(3)  评论(0)    收藏  举报