C++11テンプレートメタプログラミング-タイプ操作

2023 ワード

本稿では,テンプレートメタプログラミングを最初に紹介する際に述べたように,テンプレートメタプログラミングは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)と相互作用する2つの周辺システム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がより使いやすく、効率的で、安全になる例をいくつか紹介します.
タイプ抽出
C++11テンプレートメタプログラミング-ディレクトリを返します