шаблон 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>
.