Основываясь на этой теме, мне интересно, можно ли создать фабричный класс, который бы предоставлял тип контейнера, не определяя тип элемента контейнера.
Что-то вроде:
template <typename t_container>
class factory {
public:
using container = t_container;
}
так что что-то вроде этого, но не совсем с этим синтаксисом, потому что я знаю, что он недействителен в C++, будет работать:
...
factory<std::vector>::container<int> my_container;
...
Идея состоит в том, что factory будет определять тип контейнера, а не тип элемента, который factory::container будет содержать, оставляя это решение на усмотрение пользовательского кода.
@cigien Почему бы и нет?
@WeijunZhou Именно по этой причине вам пришлось создать using шаблон псевдонима. Как написал ОП, это невозможно, потому что t_container вообще не был бы типом (это был бы шаблон), как показано в демонстрации, на которую я дал ссылку.
ХОРОШО. Кажется, я неправильно понял, что ты имел в виду под невозможным.
кстати, factory обычно так мы называем вещь, которая что-то создает. Если вы хотите, чтобы это был просто «какой-то шаблон, в котором пользователь указывает тип элемента», я бы дал ему другое имя.





Вы хотите, чтобы t_container был шаблоном, поэтому template <typename t_container> неверно (он объявляет t_container типом, но std::vector не является типом). И после этого ваше объявление using неверно, поскольку предполагает, что t_container является типом.
Вы можете сделать это, используя аргумент шаблона шаблона:
#include <vector>
template <template <typename...> class C>
struct factory {
template <typename T>
using container = C<T>;
template <typename T>
container<T> make() { return C<T>{};}
};
int main ()
{
auto vec_int = factory<std::vector>{}.make<int>();
}
Один и тот же factory<std::vector> может создавать векторы с элементами разного типа, как показано в шаблоне псевдонима члена и шаблоне функции-члена.
Существует только одна небольшая проблема при использовании контейнера с аргументами шаблона, не относящимися к типу. Вышеупомянутое не будет работать для std::array, поскольку его второй аргумент — это size_t, а не тип. Также, например, std::map не охвачен вышеизложенным, поскольку тип его элемента определяется двумя параметрами (тип ключа и значения).
Очень хорошее решение, но мне нужно, чтобы «vec_int» был атрибутом класса. «фабрика» будет поставщиком типов, а не создателем объекта.
@canellas и? Вы можете удалить метод, если он вам не нужен.
@canellas factory<std::vector>::container<int> my_container;, о котором ты просишь, здесь. Не знаю, почему вы думаете, что «но мне нужно, чтобы vec_int был атрибутом класса» будет проблемой.
Вы правы, ваше решение - это то, что мне нужно. Большое спасибо!
Возможно, вы ищете параметры шаблона-шаблона? Что-то вроде godbolt.org/z/Pf5vh6TM9? Но у вас не может быть такого
using, как вы написали.