容器类型的C++工厂,无需定义容器元素类型

问题描述 投票:0回答:1

基于this主题,我想知道是否可以有一个工厂类来提供容器类型,而不需要定义容器元素的类型。

类似:

template <typename t_container>
class factory {
public:
  using container = t_container;
}

这样类似于这样的东西,但不完全使用这种语法,因为我知道它在 C++ 中无效,可以工作:

...
factory<std::vector>::container<int> my_container;
...

这个想法是

factory
将定义容器的类型,但不定义
factory::container
将包含的元素类型,将该决定留给用户代码。

c++ template-meta-programming factory-pattern abstraction
1个回答
4
投票

您希望

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 个参数(键和值类型)指定。

© www.soinside.com 2019 - 2024. All rights reserved.