1 个人设置页

2 有人回复时邮件通知

3 论坛的邮箱订阅
关闭/每天/一周/两周



关闭/每天/一周/两周

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

可以接受任意类型
// R
template<typename T>
class A {}; // 类模板是能接受任意类型,A后面不需要(不能)任何处理
可以接受任意指针类型
// A
template<typename T>
class A<T *> {}; // 类模板A的偏特化版本,在A后指出特化的范围
指定接受int类型
template<>
class A<int> {} // 类模板A的全特化版本(已经是类模板的一个实例了),在A后直接指出明确类型int
#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;
}
当只有一个类模板(可接受任意类型R)存在时,1, 2, 3都使用类模板实例化

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

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

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

从上面的实现可以看出,当传给模板的参数是带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的功能。

一个类模板的特化,是对某一个类模板的子集做特化处理的。而它不能"独立存在"。既只有存在一个类模板X, 才能存在对它特化的版本。
template<typename T>
class A<T *> {};
int main() { return 0; }

前段时间社区中xlings项目上有人提了一个关于centos7上 安装gcc15的但是不能使用的问题, 我一看原来是由于glibc的版本太老了导致的 (制作gcc15包的时候我也没考虑太多glibc版本依赖问题)
于是我就折腾了几天给xlings工具增加了一个从源码构建gcc工具链的helper工具 musl-cross-make, 同时也提供了一个预构建的gcc15包, 让我们在centos7上可以用下面简单的方法就能安装gcc15或自己从源码构建gcc15. 最终效果如下:
xlings install gcc@15
xlings install musl-cross-make #安装构建helper工具
# 命令格式: musl-cross-make version [--output yourOutputDir] [--target yourTargetArch]
musl-cross-make 15 --output mygcc-15
下面是具体的问题解决过程, 以及 centos上 一键创建支持cpp23的cmake模板工程项目的使用示例&演示...
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: 未找到命令

xlings install gcc@15.1.0安装后工具链的使用问题xlings install gcc@15xlings install fromesource:musl-gcc@versionxlings install musl-cross-makemusl-cross-make version --output yourInstallDir, musl-cross-make 9.4 --output mygcc-9 构建后会安装到当前目录的mygcc-9下原来的gcc

安装gcc15


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


哈喽
哈喽哈喽
mian分支 + feature分支

打算从C++11-现代C++元年开始介绍其核心的语言特性(不包括标准库), 把每个特性制作一个代码练习, 然后通过d2x的检测程序进行代码检查...
算法复杂度直观通俗理解: 每次比较完成, 被选中的基准值会被放到最终他所在的位置, 所以比较N遍即可完成排序, 而每次比较完后会分裂成2个数组, 总的数组就 $log_2^N$级别
所以算法复杂度就是 比较的遍数 x 要比较的数组的数量, 即:
$$
O(nlog_2^n)
$$
注: 文章写完后, 也可以分享到社区群里
该功能存在异常.....
@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
感觉是不是可以拆分一下, 把游戏主体 和 链表实现 分开 用比较项目的目录树风格, 然后放到github上 变成一个Demo项目
@yiten94 在 hello-mcpp中编译报错'auto' not allowed in function return type 中说:
error: 'auto' not allowed in function
该问题已经修复
在教程项目根目录运行代码命令即可更新到最新代码(或手动用git进行同步
d2x update
@sky-littlestar 我说的意思就是把你上面的代码 整理一下 用项目(Demo)的方式 放到github, 不是说其他什么写法
哈喽
哈喽哈喽