шаблон c++ с частично фиксированным списком аргументов

Рассмотрим случай, подобный следующему:

      template<typename T>
class A { ... };

template<typename T, typename DataType = std::vector<A<T>>>
class B {
  ....
  DataType data;
  ...
}

В моем случае тип может быть любым стандартным «контейнером», но он всегда должен быть специализированным с типом A. Использование A должно быть прозрачным из-за пределов класса B, однако в определении B без типа по умолчанию для DataTypeследует явно указать, например, B<int, std::deque<A<int>>. Я хотел бы удалить эту возможность и добиться чего-то вроде:

      template<typename T, typename container = std::vector>
class B{
  using DataType = container<A<T>>;
  ...
}

чтобы я специализировался на B, как B<int, std::vector>. Конечно, это не может быть именно так, потому что containerв этом случае должен быть полный тип, а затем специализированный. Есть ли способ добиться этого с помощью С++14?

1 ответ

Вы можете сделать это с параметром шаблона шаблона , например

      template<typename T, template <typename...> typename container = std::vector>
class B {
  using DataType = container<A<T>>;
  ...
};

Затем используйте его как B<int>(т.е. B<int, std::vector>) или же B<int, std::deque>.

Другие вопросы по тегам