跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

SPeakS

SPeak

@SPeak
d2learn-dev
关于
帖子
175
主题
22
群组
1
粉丝
5
关注
0

帖子

最新 最佳 有争议的

  • [论坛功能]: 邮件订阅/通知功能设置方法
    SPeakS SPeak

    1 个人设置页

    96cc2f72-ad7d-4efb-b4d5-0034fbffbc23-image.png

    2 有人回复时邮件通知

    157215f9-622b-4106-8f74-687759f5394b-image.png

    3 论坛的邮箱订阅

    关闭/每天/一周/两周

    f3fe1afe-3e26-4af2-8b98-86930ba9abc0-image.png


  • 现代C++泛型编程初识 - 类模板到模板特例化及具体应用示例
    SPeakS SPeak

    文章导读

    • 一、类模板与模板特化(全特化与偏特化)
    • 二、类模板与其模板特化的应用
    • 三、模板特化存在性问题

    一、类模板与模板特化(全特化与偏特化)

    从接受类型的角度
    类模板:全集R
    模板偏特化(部分特化):为全集的一个子集A
    模板全特化:为R中的一个"点",或者说为R中的一个元素
    匹配规则:越特化匹配优先级越高(见下面例子)

    98a9da6a-01af-4fc4-83ad-91b7ca549699-image.png

    1.类模板

    可以接受任意类型

    // R
    template<typename T>
    class A {};    // 类模板是能接受任意类型,A后面不需要(不能)任何处理
    

    2.模板偏特化(局部特化)

    可以接受任意指针类型

    // A
    template<typename T>
    class A<T *> {};    // 类模板A的偏特化版本,在A后指出特化的范围
    

    3.模板全特化

    指定接受int类型

    template<>
    class A<int> {}    // 类模板A的全特化版本(已经是类模板的一个实例了),在A后直接指出明确类型int
    

    4.例子:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    template<typename T>
    class A {
    public:
        A() {
    	cout << "R" << endl;
        }
    };
    
    /* 注释1 -- 接受指针
    template<typename T>
    class A<T *> {
    public:
        A() {
    	cout << "A" << endl;
        }
    };
    */
    
    /* 注释2 -- 接受int
    template<>
    class A<int> {
    public:
        A() {
    	cout << "int" << endl;
        }
    };
    */
    
    int main() {
        A<string> r;    // 1
        A<char *> a;    // 2
        A<int> i;       // 3
        return 0;
    }
    

    5.测试不同情况:

    当只有一个类模板(可接受任意类型R)存在时,1, 2, 3都使用类模板实例化

    v2-a53836d6d2a913d69c2fd90b0dd4371f_1440w.png

    注释1是接受所以指针类型(R的子集A),所以称其为类模板A的偏特化(范围特化)。即把类模版A所能接受的指针类型单独处理(实例化)。当取消注释1时:char * 将由这个模板类A的偏特化版本(范围特化,局部特化)处理。

    v2-2bd02b7f6a4dbb5cdbc586f98d76b92b_1440w.png

    注释2只接受int类型的参数(可以看出是全局R中的一个元素)。当你用int实例化A时,将会由这个全特化版本来实现(而不会使用可以接受任意类型的版本(泛化版))。

    v2-6a08120bfe6da8471d8fb374b2665a65_1440w.png

    二、类模板与其模板特化的应用

    用模板的偏特化 实现一个 能移除任意类型const属性的模板类:remove_const
    主要功能和用法:
    功能:
    给remove_const一个类型后
    --1.(情况1)如果这个类型没有const属性则获得这个类型本身。
    --2.(情况2)如果这个类型有const属性则移除它。
    用法:
    remove_const<Type>::type
    使用场景:
    当拿到一个未知变量时,想获得这个变量(或对象)的非const的类型
    

    1.实现情况1

    似乎没做什么事,aa是int符合情况1。但情况2不符合,bb没有变成int。

    #include <iostream>
    #include <type_traits>
    
    template<typename T>
    struct remove_const {
        using type = T;
    };
    
    
    int main() {
        int a = 1;
        const int b = 2;
        remove_const<decltype(a)>::type aa = 3;
        remove_const<decltype(b)>::type bb = 4;
        std::cout << std::is_same<decltype(aa), int>::value << std::endl;
        std::cout << std::is_same<decltype(bb), int>::value << std::endl;
        return 0;
    }
    

    运行结果:
    v2-7a36de2df8473699ecc173f27351c876_1440w.png

    2.实现情况2

    从上面的实现可以看出,当传给模板的参数是带const类型时它还会返回带const属性的类型。同时从remove_const的定义也可以看出他是个 复读机 你给他什么类型他就给你什么类型。

    这时候可以使用上面介绍的偏特化的性质,来把带有带const的类型这个子集从全集中分离出来 特殊处理。如下:

    #include <iostream>
    #include <type_traits>
    
    template<typename T>
    struct remove_const {
        using type = T;
    };
    
    template<typename T>
    struct remove_const<const T> {
        using type = T;
    };
    
    int main() {
        int a = 1;
        const int b = 2;
        remove_const<decltype(a)>::type aa = 3;
        remove_const<decltype(b)>::type bb = 4;
        std::cout << std::is_same<decltype(aa), int>::value << std::endl;
        std::cout << std::is_same<decltype(bb), int>::value << std::endl;
        return 0;
    }
    

    运行结果:

    给带const的类型,写了一个特化版本。所以当remove_const接受一个带const的类型时,就会通过这个偏特化版本实例化,由于这个偏特化版本把const从类型中分离出来了,则这里的T就是没有const的类型,从而实现去除类型const的功能。

    v2-d337e4dc338fc9a90fcfa7ef9db27804_1440w.png

    三、模板特化存在性问题

    一个类模板的特化,是对某一个类模板的子集做特化处理的。而它不能"独立存在"。既只有存在一个类模板X, 才能存在对它特化的版本。

    template<typename T>
    class A<T *> {};
    
    int main() { return 0; }
    

    v2-1023f2d6ec20e5efa6300629068527d6_1440w.png


  • 让cenos7也能轻松用上gcc15和C++23的import std特性 - 故事从xlings开源项目的一个issues开始
    SPeakS SPeak

    背景

    前段时间社区中xlings项目上有人提了一个关于centos7上 安装gcc15的但是不能使用的问题, 我一看原来是由于glibc的版本太老了导致的 (制作gcc15包的时候我也没考虑太多glibc版本依赖问题)

    于是我就折腾了几天给xlings工具增加了一个从源码构建gcc工具链的helper工具 musl-cross-make, 同时也提供了一个预构建的gcc15包, 让我们在centos7上可以用下面简单的方法就能安装gcc15或自己从源码构建gcc15. 最终效果如下:

    一键安装gcc15

    xlings install gcc@15
    

    自己在本地 一键从源码构建gcc15

    xlings install musl-cross-make #安装构建helper工具
    # 命令格式: musl-cross-make version [--output yourOutputDir] [--target yourTargetArch]
    musl-cross-make 15 --output mygcc-15
    
    • 原issues: https://github.com/d2learn/xlings/issues/107
    • xlings开源工具: https://xlings.d2learn.org

    下面是具体的问题解决过程, 以及 centos上 一键创建支持cpp23的cmake模板工程项目的使用示例&演示...

    一、问题和解决的过程

    Q1: GLIBC的版本依赖问题

    • https://github.com/d2learn/xlings/issues/107#issue-3300789666
    root/.xlings_software_install/xlings-main/bin/xmake: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /root/.xlings_software_install/xlings-main/bin/xmake)
    /root/.xlings_software_install/xlings-main/bin/xmake: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by /root/.xlings_software_install/xlings-main/bin/xmake)
    /root/.xlings_software_install/xlings-main/bin/xmake: /lib64/libc.so.6: version `GLIBC_2.29' not found (required by /root/.xlings_software_install/xlings-main/bin/xmake)
    tools/install.unix.sh:行65: xlings: 未找到命令
    

    A1: 使用musl静态构建解决libc的依赖问题 - 已解决

    4bd6a426-c93c-4733-9075-fad0bd686261-image.png

    Q2: xlings install gcc@15.1.0安装后工具链的使用问题

    • https://github.com/d2learn/xlings/issues/107#issuecomment-3167203522

    A2: 更新了gcc包(包括15.1.0)对centos的支持, 添加了可从源码构建包的选择及工具

    • gcc: 预先构建的二进制gcc工具链包
      • 安装命令示例: xlings install gcc@15
    • fromsource:musl-gcc: 从源码构建基于musl的gcc工具链的xpkg包
      • 安装命令示例: xlings install fromesource:musl-gcc@version
    • musl-cross-make: 可自定义的工具链构建helper工具
      • 安装命令示例: xlings install musl-cross-make
      • 使用命令示例: musl-cross-make version --output yourInstallDir, musl-cross-make 9.4 --output mygcc-9 构建后会安装到当前目录的mygcc-9下

    原来的gcc

    9dd8c255-77dc-47ff-b5b6-6c6345fd1ae4-image.png

    安装gcc15

    c1b573d2-6a4d-4150-ba6d-c4b57015f415-image.png

    2eae2930-e8ba-440c-9742-dcaf5ee84ab3-image.png

    二、xlings在centos上的一些使用示例 (gcc工具链 + cpp23 import std模块)

    会自动安装依赖(gcc15 / cmake4 ...) , 并配置好环境

    一键创建模板项目 + 自动安装依赖和配置环境

    2c595d41-d0ed-424f-ada7-93ef240a09a7-image.png

    构建&运行演示

    aee61b54-60b2-4a53-8060-9d14f1462269-image.png

    三、其他

    • 相关的issus: https://github.com/d2learn/xlings/issues/107
    • xlings工具文档: https://xlings.d2learn.org/documents/quick-start/one-click-install.html
    • xlings工具仓库: https://github.com/d2learn/xlings
    • 包索引仓库: https://github.com/d2learn/xim-pkgindex
    • xlings社区论坛交流版块: https://forum.d2learn.org/category/9/xlings

  • 视频链接展开测试
    SPeakS SPeak

    哈喽👋哈喽哈喽


  • 关于 GitHub 中的 Fork 仓库的简单问题
    SPeakS SPeak

    mian分支 + feature分支

    • 每次改动不要直接在main上修改, 而是基于main拉出一个对应的feature分支
    • main分支只用来同步上游的代码
    • 如果在过程中 - 上游有新的改动
    • 先把上游代码同步到本地的main
    • 然后 在feature分支 rebase 到main分支
    • 功能开发完成后 就把feature分支 PR到上游
    • 在把合入上游的代码同步到本地的main
    • feature分支生命周期结束

    57a39a00-ba74-420c-8d5d-da46dcf9e85d-image.png


  • 使用d2x工具搭建了一个现代C++核心语言特性的代码练习项目mcpp-standard(类似rustlings)
    SPeakS SPeak

    打算从C++11-现代C++元年开始介绍其核心的语言特性(不包括标准库), 把每个特性制作一个代码练习, 然后通过d2x的检测程序进行代码检查...

    代码仓库: https://github.com/Sunrisepeak/mcpp-standard


  • 通过快排模拟IDE上qosrt的实现方法
    SPeakS SPeak

    算法复杂度直观通俗理解: 每次比较完成, 被选中的基准值会被放到最终他所在的位置, 所以比较N遍即可完成排序, 而每次比较完后会分裂成2个数组, 总的数组就 $log_2^N$级别

    所以算法复杂度就是 比较的遍数 x 要比较的数组的数量, 即:

    $$
    O(nlog_2^n)
    $$

    注: 文章写完后, 也可以分享到社区群里


  • 视频链接展开测试
    SPeakS SPeak

    该功能存在异常.....


  • xlings配置环境如何跳过VSCode
    SPeakS SPeak

    @NiDHanWang 原系统中vscode在命令行环境可用吗code --version

    如果本身安装的vscode命令行可用, 可以通过下面两个方法来避免额外的vscode安装

    方法一

    通过git直接clone项目

    git clone git@github.com:Sunrisepeak/mcpp-standard.git
    

    手动删除config.xlings配置文件中的vscode依赖

    -- xim-deps
    xdeps = {
        --vscode = "",
        cpp = "", -- language
    }
    

    并删除editor = "vscode", 这行。然后, 在项目根目录运行

    xlings install
    

    方法二

    使用一键自动获取项目和配置后, 卸载额外安装的vscode版本

    xlings remove vscode
    

  • rt-thread 双链表分析及教程(附带demo)
    SPeakS SPeak

    感觉是不是可以拆分一下, 把游戏主体 和 链表实现 分开 用比较项目的目录树风格, 然后放到github上 变成一个Demo项目


  • 视频链接展开测试
    SPeakS SPeak

    @Sunrisepeak-0 在 视频链接展开测试 中说:

    该功能

    仍然异常, 关闭该功能


  • hello-mcpp中编译报错'auto' not allowed in function return type
    SPeakS SPeak

    @yiten94 在 hello-mcpp中编译报错'auto' not allowed in function return type 中说:

    error: 'auto' not allowed in function

    该问题已经修复

    • commit: https://github.com/Sunrisepeak/mcpp-standard/commit/7cfa6bce0d4356e492bf4a809de188cc0609151e

    在教程项目根目录运行代码命令即可更新到最新代码(或手动用git进行同步

    d2x update
    

  • rt-thread 双链表分析及教程(附带demo)
    SPeakS SPeak

    @sky-littlestar 我说的意思就是把你上面的代码 整理一下 用项目(Demo)的方式 放到github, 不是说其他什么写法


  • 视频链接展开测试
    SPeakS SPeak

    https://www.youtube.com/embed/fcbqFNC4DDQ?si=13FFNMV1wRzi-KF1


  • 视频链接展开测试
    SPeakS SPeak

    哈喽👋哈喽哈喽

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
d2learn forums Powered by NodeBB
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组