C++泛型模板约束深入讲解

 更新时间:2022年09月21日 08:31:58   作者:liulilittle  
C/C++ 作为 C# 语言的前置版本,ECMA工业化编程语言,自然是存在 “泛型模板约束” 的功能的,只是本文不以 C/C++ 20 新语法搞出来的 “requires” 关键字来实现,它很难用

CPP参考:(新标准)

传送门

模板对于类型的约束:

约束 template_get_size 泛型T只允许接受类型:list<T>,其实为 C/C++ 泛型模板例化特性,但与泛型模板例化略微有些区别,因为是带泛型类型约束条件的特例化。

template<typename T>
class list {
public:
    int count = 0;
};
template<typename T>
struct template_get_size;
template<typename T>
struct template_get_size<list<T> > {
    inline std::size_t size(list<T>& v) {
        return v.count;
    }
};
int main(int argc, const char* argv[]) noexcept {
    list<int> list_;
    list_.count = 100;
    template_get_size<list<int> > list_get_size_;
    printf("%d\n", list_get_size_.size(list_));
    return 0;
}

但,template_get_size<int> 仍然可以尝试编译,从语法层面没有问题,但会编译失败,原因:C/C++ 使用不完整的类型。

人们无法在编译期间来增加更多检查约束的有效性。

例一:

template<typename T>
struct template_get_size {
    static_assert(false, "Type constraints of generic templates are violated.");
};

例二:

template<typename T>
struct template_get_size;
template<typename T>
struct template_get_size<T> {
    static_assert(false, "Type constraints of generic templates are violated.");
};

上述适用于泛型模板类/结构体,同理泛型模板函数仍可以增加泛型约束,只是没有办法向模板类型一样可以明确的约束T到底需要是什么类型,这取决于模板函数内部的实现,根代码粘合剂差不多,但不意味着不能精确限制那些T类型。

泛型模板类型例化:

class A {};
class B : public A {};
template<typename T>
class say;
template<>
class say<A> {};

例如:人们需要T是一个指针,那么有以下几种方法约束:

案例一:

template<typename T>
void foo(const T* v) {}

案例二:

template<typename T>
void foo(const T& v) {
    typedef typename std::remove_pointer<T>::type element_type;
    element_type* p = NULL;
}

如果:

人们需要T是一个基类,那么这种似乎不需要模板来实现,如果是模板大约是这样的形式:

约束T必须是A类或其派生类型,但使用该模板函数的开放人员只有两个途径搞清楚T到底被约束为什么。

即:1、函数注释上明确T的约束类型,2、查看模板函数的内部实现,不像C#中明确为泛型模板类型 T 增加显示一致性的 where T 约束条件。

class A {};
class B : public A {};
template<typename T>
void foo(const T* v) {
    A* a = const_cast<T*>(v);
}
int main(int argc, const char* argv[]) noexcept {
    B b;
    foo(&b);
    return 0;
}

一个好的建议是:

每个泛型模板的类型约束都应在类型/函数注释上明确指出,这样使用模板的开发人员不需要尝试预编译代码或阅读模板代码实现来判定模板代码约束条件。

到此这篇关于C++泛型模板约束深入讲解的文章就介绍到这了,更多相关C++泛型模板约束内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现学生信息管理系统开发

    C语言实现学生信息管理系统开发

    这篇文章主要为大家详细介绍了C语言实现学生信息管理系统开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • c++并查集优化(基于size和rank)

    c++并查集优化(基于size和rank)

    这篇文章主要介绍了c++并查集优化(基于size和rank),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言超细致讲解分支语句

    C语言超细致讲解分支语句

    分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句
    2022-05-05
  • 在vs2017上配置AppGameKit库的图文教程

    在vs2017上配置AppGameKit库的图文教程

    这篇文章主要介绍了在vs2017上配置AppGameKit库的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • c++实现简单的线程池

    c++实现简单的线程池

    本文介绍的线程池采用C++语言,在windows平台下实现。本着技术分享的精神写作本文同时公布源代码。欢迎大家指出该线程池存在的问题并对当前性能进行讨论。
    2015-03-03
  • C++ 函数指针详细总结

    C++ 函数指针详细总结

    这篇文章主要介绍了C++ 函数指针内容,下面文章围绕C++ 函数指针的相关资料展开详细内容,包括函数指针的进阶内容,需要的朋友可以参考一下,希望对大家有所帮助
    2021-11-11
  • 利用C语言实现五子棋游戏

    利用C语言实现五子棋游戏

    这篇文章主要为大家详细介绍了利用C语言实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 深入理解c/c++ 内存对齐

    深入理解c/c++ 内存对齐

    这篇文章主要介绍了c/c++ 内存对齐,有需要的朋友可以参考一下
    2014-01-01
  • C语言实现高精度减法

    C语言实现高精度减法

    高精度的本质是将数字以字符串的形式读入,然后将每一位分别存放入int数组中,通过模拟每一位的运算过程,来实现最终的运算效果,下面我们就来看看C语言如何实现高精度减法吧
    2023-11-11
  • C++虚函数表和虚析构介绍

    C++虚函数表和虚析构介绍

    这篇文章主要介绍了C++虚函数表和虚析构,虚函数表是C++实现多态的基础,多态是面向对象的三大特性之一,下面文章我们一起来看看详细内容,需要的朋友可以参考一下
    2021-11-11

最新评论