複数のパラメーターに対するC ++部分クラステンプレートの特殊化

ティモ

基本的に、いくつかの再マップ可能なピンを持つハードウェア周辺機器を表すテンプレートクラスを定義しようとしています。マッピングはコンパイル時(または実際にはハードウェア回路図の描画時)に定義されるため、これらの定義をテンプレートパラメーターを介して取り込みたいと思います。ただし、各ピンは他のピンとは独立してマッピングできるため、可能なタイプのセットは基本的に個々のマッピングのデカルト積であり、これを機能させることができるかどうかはわかりません。私が今持っているのは:

     enum class SPI1_NSS {
        PA4,
        PA15
     };

     enum class SPI1_SCK {
        PA5,
        PB3
     };

     template<SPI1_NSS nss_enum, SPI1_SCK sck_enum>
     struct SPI_1 {
        //...other stuff

        struct nss;
        struct sck;

     };

     template<SPI1_SCK sck>
     struct SPI_1<SPI1_NSS::PA4, sck>::nss {
        using pin = GPIOs::A::pin<4>;
     };

     template<SPI1_SCK sck>
     struct SPI_1<SPI1_NSS::PA15, sck>::nss {
        using pin = GPIOs::A::pin<15>;
     };

     template<SPI1_NSS nss>
     struct SPI_1<nss, SPI1_SCK::PA5>::sck {
        using pin = GPIOs::A::pin<5>;
     };

     template<SPI1_NSS nss>
     struct SPI_1<nss, SPI1_SCK::PB3>::sck {
        using pin = GPIOs::B::pin<3>;
     };

これは失敗しerror: invalid class name in declaration of 'class HAL::SPI_1<HAL::SPI1_NSS::PA4, sckp>::nss'、他の人にも同様のエラーが発生します。2つのテンプレートパラメータのいずれかを削除すると機能します。

私が期待するのは、例えば、

    using spi = SPI_1<SPI1_NSS::PA4, SPI1_SCK::PB3>;

タイプspi::nss::pinはになりGPIOs::A::pin<4>、にspi::sck::pinなりますGPIOs::B::pin<3>このような「デカルト専門化」はどういうわけか可能でしょうか?

GPIOタイプを直接テンプレート化できることは確かですが、これは少し過剰に設計されています。ただし、これから得られる利点は、列挙型がピンの有効な選択のみを提供および保証するため、インターフェイスがより明確になることです。

StoryTeller-Unslander Monica

直交性を特殊化することが目的の場合は、ネストされていない個別のメタ関数を使用します SPI_1

namespace detail {
  template<SPI1_NSS>
  stuct nss;

  template<>
  struct nss<PA4> {
    using pin = GPIOs::A::pin<4>;
  };

  template<>
  struct nss<PA15> {
    using pin = GPIOs::A::pin<15>;
  };

  // Same for sck
}

template<SPI1_NSS nss_enum, SPI1_SCK sck_enum>
struct SPI_1 {
   //...other stuff

   using nss = detail::nss<nss_enum>;
   using sck = detail::sck<sck_enum>;
};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートクラスの部分特殊化構文

分類Dev

c ++複数パラメーターテンプレートクラスメンバーの特殊化

分類Dev

フレンドクラスの部分的なテンプレートの特殊化?

分類Dev

部分的なクラステンプレートの特殊化c ++ 11

分類Dev

クラステンプレートの部分的な特殊化とクラスメンバーの特殊化について混乱する何か

分類Dev

クラステンプレートの部分的特殊化の同等性

分類Dev

SFINAEおよび部分クラステンプレートの特殊化

分類Dev

クラス定義外の部分的なテンプレート特殊化定義

分類Dev

複数のタイプのクラステンプレートの特殊化

分類Dev

クラスと関数テンプレートの特殊化

分類Dev

C ++クラステンプレートの特殊化

分類Dev

ネストされたテンプレートテンプレートクラスの部分的な特殊化

分類Dev

std :: functionのようなテンプレートクラスの部分的なテンプレートの特殊化

分類Dev

内部クラスのテンプレートの特殊化

分類Dev

部分的なテンプレートの特殊化エラー

分類Dev

クラステンプレートのメンバー関数の特殊化

分類Dev

部分的な特殊化によるクラステンプレート引数の演繹

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

テンプレートクラス-メンバー関数の特殊化

分類Dev

部分的な特殊化によるテンプレートのサブクラス化

分類Dev

C ++コンストラクターテンプレートの特殊化

分類Dev

テンプレート引数のタイプを制限するためのクラスの可変個引数テンプレート部分特殊化

分類Dev

さらに別のクラステンプレートの特殊化(ブールパラメーター)

分類Dev

c ++テンプレート特殊化パラメーターの複製

分類Dev

クラスエラー内のC ++テンプレートの特殊化

分類Dev

派生クラスによるc ++テンプレートの特殊化

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

Related 関連記事

  1. 1

    テンプレートクラスの部分特殊化構文

  2. 2

    c ++複数パラメーターテンプレートクラスメンバーの特殊化

  3. 3

    フレンドクラスの部分的なテンプレートの特殊化?

  4. 4

    部分的なクラステンプレートの特殊化c ++ 11

  5. 5

    クラステンプレートの部分的な特殊化とクラスメンバーの特殊化について混乱する何か

  6. 6

    クラステンプレートの部分的特殊化の同等性

  7. 7

    SFINAEおよび部分クラステンプレートの特殊化

  8. 8

    クラス定義外の部分的なテンプレート特殊化定義

  9. 9

    複数のタイプのクラステンプレートの特殊化

  10. 10

    クラスと関数テンプレートの特殊化

  11. 11

    C ++クラステンプレートの特殊化

  12. 12

    ネストされたテンプレートテンプレートクラスの部分的な特殊化

  13. 13

    std :: functionのようなテンプレートクラスの部分的なテンプレートの特殊化

  14. 14

    内部クラスのテンプレートの特殊化

  15. 15

    部分的なテンプレートの特殊化エラー

  16. 16

    クラステンプレートのメンバー関数の特殊化

  17. 17

    部分的な特殊化によるクラステンプレート引数の演繹

  18. 18

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  19. 19

    C ++テンプレートの特殊化に基本クラスを追加する

  20. 20

    C ++テンプレートの特殊化に基本クラスを追加する

  21. 21

    テンプレートクラス-メンバー関数の特殊化

  22. 22

    部分的な特殊化によるテンプレートのサブクラス化

  23. 23

    C ++コンストラクターテンプレートの特殊化

  24. 24

    テンプレート引数のタイプを制限するためのクラスの可変個引数テンプレート部分特殊化

  25. 25

    さらに別のクラステンプレートの特殊化(ブールパラメーター)

  26. 26

    c ++テンプレート特殊化パラメーターの複製

  27. 27

    クラスエラー内のC ++テンプレートの特殊化

  28. 28

    派生クラスによるc ++テンプレートの特殊化

  29. 29

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

ホットタグ

アーカイブ