前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 05 - 特化

C++ 05 - 特化

作者头像
Reck Zhang
发布2021-08-11 11:52:36
3460
发布2021-08-11 11:52:36
举报
文章被收录于专栏:Reck Zhang

特化

特化即是为以有的模板参数进行特殊化指定, 根据特化的范围和对象, 可以分为全特化/偏特化, 类特化/函数特化.

全特化

对一个特定参数集合自定义当前模板, 类模板和函数模板都可以全特化. 全特化的模板参数列表应当为空, 并在模板实参中一一指定.

代码语言:javascript
复制

template<typename T1, typename T2>
class A {};

template<>
class A<int, double> {};

template<typename T1, typename T2>
void foo() {};

template<>
void foo<int, double>() {};

偏特化

偏特化是给自定义一个参数集合的模板, 偏特化后的模板需要进一步的实例化才能形成确定的签名. 函数模板是不能进行偏特化的, 可以通过重载来代替偏特化的需要.

代码语言:javascript
复制

template<typename T>
class A {};

template<>
class A<int> {};

泛型约束

在C#中我们可以通过where来进行泛型约束, 指定接口, 基类或要求泛型类型为引用, 值或非托管类型. 在C++中我们可以用enable_if+特化来实现指定基类的功能.

代码语言:javascript
复制
class Base {};
class Derived : public Base {};

template <typename T, typename Enable = void>
class Foo {
public:
    static void f() {
        std::cout << "Default" << std::endl;
    }
};

template <typename T>
class Foo<T, typename std::enable_if<std::is_base_of<Base, T>::value>::type> {
public:
    static void f() {
        std::cout << "Base" << std::endl;
    }
};

int main() {
    Foo<Derived>::f();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 特化
    • 全特化
      • 偏特化
        • 泛型约束
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档