美文网首页
C++11 模板元编程 - 类型萃取

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

作者: MagicBowen | 来源:发表于2016-09-17 09:22 被阅读516次

类型萃取(trait)的概念我们前面有介绍过。可以将trait看做是一种静态反射技术,通过trait我们可以自动提取出想要的代码元信息,避免让客户代码显示去提供这些信息,从而使得客户代码更加的简洁。

在dates中,客户可使用FakeSystem定义一个fake系统,与SUT交互。FakeSystem拥有sendrecv接口,分别向SUT发送消息,以及从SUT接收消息。send的入参是一个原型为void(Msg&)的lambda函数,用于描述如何构造Msg消息。

visitor.send([this](AccessReq& req)
        {
            req.capability = CAPABILITY;
        });

由于一个FakeSystem可以发送多种msg,所以send接口无法确定lambda的具体类型,因此send的参数只能定义为泛型参数,它的原型为:

template<typename BUILDER>
void send(const BUILDER& builder);

这样send就可以传入各种构造不同消息类型的lambda了,而且还可以调用原型一致的普通函数或者仿函数,客户使用起来非常简洁。

现在我们来实现sendsend中需要创建一个消息,然后交给builder去构造。如下伪代码:

template<typename BUILDER>
void send(const BUILDER& builder)
{
    Msg msg; // 这里Msg到底应该是什么类型?
    builder(msg);
    // ...
}

上面代码的问题在于,我们不知道Msg的类型!Msg的类型是由客户传入的不同builder决定的,例如visitor.send([this](AccessReq& req){...})中,Msg是AccessReq。换句话说,我们需要从传入的lambda表达式的类型中获取Msg的类型。

模板元编程可以帮助我们解决这个问题。还记得我们前面介绍的TLP库中trait工具中的__lambda_para()吗?于是代码修改如下:

template<typename BUILDER> 
void send(const BUILDER& builder)
{
    using Msg = __lambda_para(BUILDER, 0); // 获取BUILDER的参数列表中的第一个参数类型
    Msg msg;
    builder(msg);
    // ...
}

如上我们通过类型萃取,从客户传入的函数类型中取出了参数的类型,使得框架的接口保持了简洁和灵活性。


类型选择

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

相关文章

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

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

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

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

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

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

  • C++11 模板元编程 - 类型操纵

    本文最开始介绍模板元编程的时候说过,模板元编程是写C++框架离不开的技术。本例将通过介绍模板元编程在dates框架...

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

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

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

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

  • C++11 模板元编程 - 元编程

    从本节开始我们将模板元编程当做一门独立的函数式语言来讨论它的方方面面。 所谓元编程,就是指可以产生程序的程序。由于...

  • C++11 模板元编程 - 鸭子类型

    模板为C++提供了鸭子类型(Duck typing)的特性。所谓鸭子类型,指的是代码关注的不是对象的类型本身,而是...

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

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

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

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

网友评论

      本文标题:C++11 模板元编程 - 类型萃取

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