gpt4 book ai didi

c++ - 模板模板参数 - std::array 的扩展

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:41 27 4
gpt4 key购买 nike

我有一个关于模板模板参数的问题:

让我们考虑以下类:

template<typename T, template<class, class=std::allocator<T> > class UnderlyingContainerType = std::vector>
class MyContainer
{
public:
T Value1;
T Value2;
UnderlyingContainerType<T> Container;

MyContainer() {}

/* methods implementation goes here */
};

在这个例子中,MyContainer 是一个容器聊天,它使用一个底层的 STL 兼容容器来做任何事情。

将底层容器类型声明为模板模板参数,而不是常规模板参数,允许方便地使用 MyContainer 类,例如:

    MyContainer<int> MCV; //implicitly using vector
MyContainer<int, std::list> MCL; //no need to write std::list<int> thanks to the
//template template parameters

现在,虽然这可以与大多数 STL 容器一起完美工作,例如 std::vector、std::deque、std::list 等等,但它无法工作,例如,与 std 一起工作: :c++11 中提供的数组。

原因是 std::array 的模板参数签名与 vector 不同。具体来说,它们是:

std::vector<class T, class allocator = std::allocator<T> >
std::array<class T, int N>

我的问题是是否有一种方法可以泛化 MyContainer 类,以便底层容器也可以是 std::array。

先谢谢你了。

最佳答案

vectorarray 接口(interface)的共同点仅限于元素类型。您的容器应反射(reflect):

template<typename T, template<typename> class underlying_container>
struct container
{
underlying_container<T> storage;
};

使用现在需要一个小技巧:

template<typename T> using vec = vector<T>;
template<typename T> using arr2 = array<T, 2>;

请注意,vecvector 不同,它具有固定的分配器,而 arr2array 不同,它具有固定大小。

使用现在很简单:

container<int, vec> a;
container<double, arr2> b;

See the example in action.

或者,如果您希望将接口(interface)与 vector 使用的接口(interface)相匹配,只需为 array 添加一个模板别名来实例化大小并添加一个未使用的类型参数:

template<typename T, typename> using arr2 = array<T, 2>;

See it in action.

关于c++ - 模板模板参数 - std::array 的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29086541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com