Подобное изменение поведения с помощью параметра шаблона обычно называется Policy, чтобы отличить его от паттерна Strategy, который представляет собой точно такое же действие с полиморфизмом во время выполнения, а не во время компиляции (см. книгу Modern C++ Design и GoF Design Patterns).
Моя единственная критика заключается в следующем
что стиль псевдонимов шаблонов стал идиоматическим с C++11, и немного меньше типизации:
template<typename T>
using SafeQueue = BaseQueue<T, IrqGuard>;
что если вам когда-нибудь понадобится написать метафункции более высокого уровня над BaseQueue
, это будет немного проще, если вы реэкспортируете параметры шаблона, например:
template<typename T, typename GuardT>
struct BaseQueue
{
using value_type = T;
using guard_type = GuardT;
Прикрепляю к посту несколько видео по теме: