gpt4 book ai didi

c++ - 如何在模板模板参数中使用默认参数以外的参数进行实例化

转载 作者:行者123 更新时间:2023-11-28 08:21:56 26 4
gpt4 key购买 nike

我正在努力巩固我对模板模板参数的理解。在 C++ 模板完整指南(Vandervoorde,Josuttis)中,他们在第 52 页有一个示例,我想使用该示例,如下图所示:

codeSnippet

(我也在尝试学习如何在 stackoverflow 上使用来自 Picasa 的图像,所以如果上面的方法不起作用,这里有一个更详细的版本)

书中的原始代码

template <typename T,
template <typename ELEM, typename ALLOC=std::allocator<ELEM> > class CONT=std::vector>
class Stack
{
private:
CONT<T > elems; //Why doesn't CONT<T, ALLOC> elems; compile?
};

不会向您展示如何将其用于不同的分配器。他们确实显示了不同的容器:

Stack<int, std::deque> my_deque_stack;

我天真地尝试了:

Stack<int, std::deque<int,  std::allocator<int> >  > my_deque_int_stack;

我还尝试在私有(private)部分将 CONT 定义为

CONT<T, ALLOC>

但这也会产生编译器错误。我想知道在我想使用双端队列但想指定不同分配器的地方使用 Stack 模板的正确语法是什么。我在这里阅读了一些类似的帖子,这些帖子指出周围散布着类型名称或模板限定符,我尝试了几个但似乎无法找到神奇的公式。

最佳答案

CONT 里面的参数定义实际上并没有被编译器使用。 template-template 参数 CONT 实际上类似于一个函数,它接受 2 种类型的输入并返回一种新的类型:

// pseudo code
type Stack(type T, type(*CONT)(type ELEM, type ALLOC = etc)) {
return CONT(T);
}

和正常的函数指针声明一样,名称 ELEM、ALLOC 实际上被编译器忽略

编译器看到的只是

template <typename T,
template <typename E, typename = std::allocator<E> > class CONT = std::vector>
struct Stack { ... };

因此,您根本不能使用 ALLOC。


那么要解决吗?好吧,你传递了一个额外的参数!就像普通 C++ 函数中的情况一样:

// pseudo code
type Stack(type T, type(*CONT)(type, type), type ALLOCATOR = etc) {
// ^^^^^^^^^^^^^^^^^^^^
return CONT(T, ALLOCATOR);
}

相应的实际模板声明是

template <typename T,
template <typename, typename> class CONT = std::vector,
typename ALLOCATOR = std::allocator<T> >
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
struct Stack {
...
CONT<T, ALLOCATOR> elems;
};

//...
Stack<int, std::vector, std::allocator<int> > s;

关于c++ - 如何在模板模板参数中使用默认参数以外的参数进行实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504401/

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