2012年3月20日火曜日

Variadic Templates 始めました

C++11 の Variadic Templates をはじめました。
早速、テストフレームワーク(iutest v0.22.0.0)に組み込んでみました。

※ここでは、テストフレームワークに組み込んだ時のことを書いています。Variadic Templates 自体の説明は省かせて頂きます。

型付けテストや値をパラメータ化したテストでは、任意の個数のパラメータを設定できます。
たとえば、以下のような使い方をします。
// 値をパラメータ化したテスト
INSTANTIATE_TEST_CASE_P(TestPInstance, TestP, testing::Values(
    "い", "ろ", "は", "に", "ほ", "へ", "と"));

// 型付けテスト
TYPED_TEST_CASE(TypedTest, testing::Types<int, short, float>);

しかし、これには制限があります。
Values や Tepes は50個までしか使えません。

template<typename T1 = detail::None, typename T2 = detail::None, typename T3 = detail::None, typename T4 = detail::None
, typename T5 = detail::None, typename T6 = detail::None, typename T7 = detail::None, typename T8 = detail::None, typename T9 = detail::None
, typename T10 = detail::None, typename T11 = detail::None, typename T12 = detail::None, typename T13 = detail::None, typename T14 = detail::None
, typename T15 = detail::None, typename T16 = detail::None, typename T17 = detail::None, typename T18 = detail::None, typename T19 = detail::None
, typename T20 = detail::None, typename T21 = detail::None, typename T22 = detail::None, typename T23 = detail::None, typename T24 = detail::None
, typename T25 = detail::None, typename T26 = detail::None, typename T27 = detail::None, typename T28 = detail::None, typename T29 = detail::None
, typename T30 = detail::None, typename T31 = detail::None, typename T32 = detail::None, typename T33 = detail::None, typename T34 = detail::None
, typename T35 = detail::None, typename T36 = detail::None, typename T37 = detail::None, typename T38 = detail::None, typename T39 = detail::None
, typename T40 = detail::None, typename T41 = detail::None, typename T42 = detail::None, typename T43 = detail::None, typename T44 = detail::None
, typename T45 = detail::None, typename T46 = detail::None, typename T47 = detail::None, typename T48 = detail::None, typename T49 = detail::None
, typename T50 = detail::None
>struct Types
{
    typedef detail::TypeList50<T1, T2, T3, T4, T5, T6, T7, T8, T9
        , T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
        , T20, T21, T22, T23, T24, T25, T26, T27, T28, T29
        , T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
        , T40, T41, T42, T43, T44, T45, T46, T47, T48, T49
        , T50
    > type;
};

このようなコードを何個も何個も書いてます。
まぁ50個あれば十分かもしれませんが、これを50個も書くのは大変です・・・
しかし、Variadic Templates があればこれだけです。

template<typename ...Args>
struct Types
{
    typedef detail::VariadicTypeList<Args...> type;
};

とっても便利ですね!
細かな実装は、iutest のソースを見てください。
今後も C++11 の機能を組み込んでいきたいと思います。

0 件のコメント:

コメントを投稿