基于this主题,我想知道是否可以有一个工厂类来提供容器类型,而不需要定义容器元素的类型。
类似:
template <typename t_container>
class factory {
public:
using container = t_container;
}
这样类似于这样的东西,但不完全使用这种语法,因为我知道它在 C++ 中无效,可以工作:
...
factory<std::vector>::container<int> my_container;
...
这个想法是
factory
将定义容器的类型,但不定义 factory::container
将包含的元素类型,将该决定留给用户代码。
您希望
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
不在上面的范围内,因为它的元素类型由 2 个参数(键和值类型)指定。