基本的に、いくつかの再マップ可能なピンを持つハードウェア周辺機器を表すテンプレートクラスを定義しようとしています。マッピングはコンパイル時(または実際にはハードウェア回路図の描画時)に定義されるため、これらの定義をテンプレートパラメーターを介して取り込みたいと思います。ただし、各ピンは他のピンとは独立してマッピングできるため、可能なタイプのセットは基本的に個々のマッピングのデカルト積であり、これを機能させることができるかどうかはわかりません。私が今持っているのは:
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タイプを直接テンプレート化できることは確かですが、これは少し過剰に設計されています。ただし、これから得られる利点は、列挙型がピンの有効な選択のみを提供および保証するため、インターフェイスがより明確になることです。
直交性を特殊化することが目的の場合は、ネストされていない個別のメタ関数を使用します 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]
コメントを追加