C++11 模板元編程 - 類型操縱


本文最開始介紹模板元編程的時候說過,模板元編程是寫C++框架離不開的技術(shù)。本例將通過介紹模板元編程在dates框架中的應(yīng)用,來介紹如何使用模板元編程在框架開發(fā)中操縱類型,幫助你的代碼更易用,性能更高并且更安全。

Dates是本人開發(fā)的一個針對C++程序的模塊和系統(tǒng)級別的FT(Functional Test)測試框架。它可以模擬被測系統(tǒng)的交互系統(tǒng),讓它們以同步或者異步的方式發(fā)消息給被測系統(tǒng),然后再由模擬系統(tǒng)接收被測系統(tǒng)的返回消息并進(jìn)行校驗(yàn)。用Dates描述測試用例,主要工作就是在框架中創(chuàng)建被測系統(tǒng)的周邊交互系統(tǒng),并且按照消息的時序關(guān)系描述測試用例,構(gòu)造消息,并對接收到的消息內(nèi)容進(jìn)行斷言校驗(yàn)。

Dates需要結(jié)合一款針對“運(yùn)行時C++”的xUnit測試框架一同使用,它需要借助xUnit測試框架提供的測試斷言和測試管理的能力。Dates的設(shè)計是和下層的xUnit測試框架解耦的,所以你可以使用任何一款“運(yùn)行時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);
            });
}

該用例中模擬了與被測系統(tǒng)SUT(System Under Test)交互的兩個周邊系統(tǒng)visitor和commander。通過測試用例我們可以看到,SUT一旦收到從visitor發(fā)來的AccessReq消息,就需要給commander發(fā)一條CfgReq消息,CfgReq消息中需要攜帶AccessReq中的capability字段值給commander。一旦commander返回OK,則SUT需要給visitor發(fā)送AccessRsp消息,其中的result值為SUCCESS。

關(guān)于dates的具體實(shí)現(xiàn)細(xì)節(jié),感興趣的話可以下載dates的源碼:https://github.com/MagicBowen/dates。本文只介紹幾處dates如何使用模板元編程來做類型操縱,最終使得dates變得更加易用、高效和安全的例子。


類型萃取

返回 C++11模板元編程 - 目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 熟悉C++的程序員都知道,C++是一門多范式編程語言,支持面向過程、面向?qū)ο蟆⒎盒途幊桃约昂瘮?shù)式編程范式。然而提到...
    MagicBowen閱讀 7,167評論 8 18
  • 一般情況下一個系統(tǒng)可以發(fā)送和接收的消息是確定的。例如前面的例子中,visitor可以發(fā)送AccessReq消息,可...
    MagicBowen閱讀 2,153評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • 【宋丫聽書】20171107《讓電影陪伴孩子成長》學(xué)而思D22 今天惟迦的帶讀,提到《想做熊的孩子》,一開始聽到這...
    宋duck閱讀 310評論 0 0