C++20的简写函数模板

文章目录

C++20引入了简写函数模板(Abbreviated Function Template),这是一种更简洁的函数模板声明方式,允许使用 auto或带有约束的 auto来代替显式的模板参数声明。

简写函数模板的语法

当在函数参数列表中使用auto或带有约束的auto时,编译器会自动为每个占位符生成一个虚构的模板参数。例如:

cpp 复制代码
void f1(auto); // 等价于 template <class T> void f1(T);
void f2(C1 auto); // 等价于 template <C1 T> void f2(T),如果C1是一个概念(Concept)
void f3(C2 auto...); // 等价于 template <C2... Ts> void f3(Ts...)
void f4(const C3 auto*, C4 auto&); // 等价于 template <C3 T, C4 U> void f4(const T*, U&)

此外,简写函数模板可以像普通函数模板一样进行特化。

示例代码

以下是一个简写函数模板的示例:

cpp 复制代码
namespace {
    auto get_sum(auto a, auto b) {
        return a + b;
    }

    template <typename T>
    concept IntegralOrFloating = std::is_integral_v<T> || std::is_floating_point_v<T>;

    auto get_sum2(IntegralOrFloating auto a, IntegralOrFloating auto b) {
        return a + b;
    }
}

int main() {
    std::cout << "Sum: " << get_sum(6, 8) << std::endl; // 输出14
    std::cout << "Sum: " << get_sum(6, 8.8) << std::endl; // 输出14.8
    std::cout << "Sum2: " << get_sum2(6, 8) << std::endl; // 输出14
    std::cout << "Sum2: " << get_sum2(6, 8.8) << std::endl; // 输出14.8
    return 0;
}

在这个例子中,get_sum是一个简写函数模板,可以接受任意类型的参数并返回它们的和。get_sum2则使用了概念(Concept)来限制参数类型,确保它们是整数或浮点数。

优点

简写函数模板的主要优点是语法更加简洁,减少了模板声明的冗余,同时保持了类型安全和灵活性。

如果你对简写函数模板感兴趣,可以参考以下博客和教程:

相关推荐
charlie1145141912 天前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
charlie1145141913 天前
理解C++20的革命特性——协程引用之——利用协程做一个迷你的Echo Server
网络·学习·socket·c++20·协程·epoll·raii
charlie1145141914 天前
理解C++20的革命特性——协程支持2:编写简单的协程调度器
c++·学习·算法·设计模式·c++20·协程·调度器
charlie1145141914 天前
精读C++20设计模式——结构型设计模式:外观模式
c++·学习·设计模式·c++20·外观模式
渡我白衣5 天前
C++ :std::bind 还能用吗?它和 Lambda 有什么区别?
开发语言·c++·c++20
charlie1145141915 天前
理解C++20的革命特性——协程支持1
c++·学习·c++20·协程·语言特性·调度·现代c++
渡我白衣5 天前
C++20 协程:在 AI 推理引擎中的深度应用
大数据·人工智能·c++20
charlie1145141915 天前
精读 C++20 设计模式:行为型设计模式 — 访问者模式
c++·学习·设计模式·访问者模式·c++20
charlie1145141917 天前
精读C++20设计模式——行为型设计模式:命令模式
c++·学习·设计模式·程序设计·命令模式·c++20
charlie1145141918 天前
精读C++20设计模式——行为型设计模式:迭代器模式
c++·学习·设计模式·迭代器模式·c++20