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

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

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

本文最开始介绍模板元编程的时候说过,模板元编程是写C++框架离不开的技术。本例将通过介绍模板元编程在dates框架中的应用,来介绍如何使用模板元编程在框架开发中操纵类型,帮助你的代码更易用,性能更高并且更安全。

Dates是本人开发的一个针对C++程序的模块和系统级别的FT(Functional Test)测试框架。它可以模拟被测系统的交互系统,让它们以同步或者异步的方式发消息给被测系统,然后再由模拟系统接收被测系统的返回消息并进行校验。用Dates描述测试用例,主要工作就是在框架中创建被测系统的周边交互系统,并且按照消息的时序关系描述测试用例,构造消息,并对接收到的消息内容进行断言校验。

Dates需要结合一款针对“运行时C++”的xUnit测试框架一同使用,它需要借助xUnit测试框架提供的测试断言和测试管理的能力。Dates的设计是和下层的xUnit测试框架解耦的,所以你可以使用任何一款“运行时C++” xUnit测试框架来和dates组合。如下是一个用Dates描述的测试用例,在这个例子中我们使用的是常用的C++ xUnit测试框架gtest

#include <gtest/gtest.h>

struct AccessTest : public testing::Test
{
    // ...
    FakeSystem visitor;
    FakeSystem commander;
};

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

    commander.recv([this](const CfgReq& cfg)
            {
                ASSERT_EQ(CAPABILITY, cfg.capability);
            });

    commander.send([](CfgRsp& rsp)
            {
                rsp.result = OK;
            });

    visitor.recv([](const AccessRsp& rsp)
            {
                ASSERT_EQ(SUCCESS, rsp.result);
            });
}

该用例中模拟了与被测系统SUT(System Under Test)交互的两个周边系统visitor和commander。通过测试用例我们可以看到,SUT一旦收到从visitor发来的AccessReq消息,就需要给commander发一条CfgReq消息,CfgReq消息中需要携带AccessReq中的capability字段值给commander。一旦commander返回OK,则SUT需要给visitor发送AccessRsp消息,其中的result值为SUCCESS。

关于dates的具体实现细节,感兴趣的话可以下载dates的源码:https://github.com/MagicBowen/dates。本文只介绍几处dates如何使用模板元编程来做类型操纵,最终使得dates变得更加易用、高效和安全的例子。


类型萃取

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

相关文章

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

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

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

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

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

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

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

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

  • 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/osgiettx.html