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


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

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

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

#include 

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 模板元编程 - 类型操纵)