美文网首页
C++11 模板元编程 - 模板的类型计算

C++11 模板元编程 - 模板的类型计算

作者: MagicBowen | 来源:发表于2016-09-14 10:30 被阅读911次

除了可以计算数值,编译期更具有价值的是类型计算。我们可以将编译期常量和类型都看做是编译期的可计算对象。

我们知道模板的所有形参被实参替换后,模板自身就具现化为一个具体的类型了。但是模板自身具现化的这个类型对于我们想要的编译期类型计算来说缺少抽象能力。模板的类型计算结果如果保存在模板内部定义的嵌套类型中,这将会为模板计算提供封装性和信息隐藏的能力。

模板内部定义类型的方法除了可以直接在模板内部定义嵌套类,更多的是使用typedef。

如下我们定义了一个类模板,它的入参是类型T,内部通过Type定义了T的指针类型T*

template<typename T>
struct PointerOf
{
    typedef T* Type;
};

我们可以像下面这样使用该模板:

PointerOf<const char>::Type s = "Hello world!";
std::cout << s << std::endl;

如同前面数值计算一样,我们可以这样理解PointerOfPointerOf是一个编译期的函数,它使用<typename T>声明了它有一个类型形参T。我们通过访问Type可以获得该函数的返回值,它也是一个类型。这个函数的功能是在C++编译期将一个输入类型转变为它对应的指针类型。所以调用PointerOf<const char>::Type其实是和const char *本质上一样。

我们定义的这个PointerOf似乎有些无聊,但这却是类型计算的基础。后面当我们把这种类型计算的小函数组合起来,会逐渐看到它们的威力。

最后,C++11标准扩展了using关键字来专门定义类型别名,它的用法和定义变量的习惯类似,且功能也比typedef强大得多,所以我们后续类型计算统一用using关键字定义类型别名。PointerOf的定义修改如下:

template<typename T>
struct PointerOf
{
    using Type = T*;
};

模板递归

返回 C++11模板元编程 - 目录

相关文章

  • C++11 模板元编程 - 模板的类型计算

    除了可以计算数值,编译期更具有价值的是类型计算。我们可以将编译期常量和类型都看做是编译期的可计算对象。 我们知道模...

  • C++11 模板元编程 - 两阶段的C++语言

    前面我们介绍了C++模板元编程的基础知识。我们将模板元编程的计算对象统一到类型上,引入了元函数的概念。元函数是模板...

  • 模板元编程

    什么是模板元 模板元编程是一种编译期计算的编程方法。如果你学过任意一门函数式的编程语言,那么你对模板元编程的理解一...

  • C++11 模板元编程 - 模板的数值计算

    模板的数值计算发生在编译期,计算的参数由模板入参输入,计算的结果由模板内部定义的enum或者static cons...

  • C++11 模板元编程 - 模板的类型参数

    下面是我们熟悉的类模板的例子:一个简单的容器栈,它可以支持不同的类型做元素。 它的用法如下: 对于模板元编程,我们...

  • C++11 模板元编程 - 模板的编译期计算

    和函数求值类似,当模板的形参被实参替换时,模板会进行编译期计算。由于模板的参数支持类型参数和非类型参数,所以模板在...

  • C++11 模板元编程 - 模板的非类型参数

    前面的例子中,我们分别使用了类型和模板作为类模板的参数。除此之外,模板还支持非类型模板参数。 如下用数组实现Sta...

  • C++11 模板元编程 - 类型校验

    一般情况下一个系统可以发送和接收的消息是确定的。例如前面的例子中,visitor可以发送AccessReq消息,可...

  • C++11 模板元编程 - 类型萃取

    类型萃取(trait)的概念我们前面有介绍过。可以将trait看做是一种静态反射技术,通过trait我们可以自动提...

  • C++11 模板元编程 - 类型选择

    上面我们在send的函数实现中创建了一个msg,它的内存是在函数栈空间上临时申请的。一般系统间发送的消息可能会比较...

网友评论

      本文标题:C++11 模板元编程 - 模板的类型计算

      本文链接:https://www.haomeiwen.com/subject/godvettx.html