c – 模板模板参数有哪些用途?
作者:互联网
我已经看到了一些使用模板模板参数(即以模板作为参数的模板)来进行基于策略的类设计的C示例.这种技术有什么其他用途?
解决方法:
我认为您需要使用模板模板语法来传递一个参数,其类型是依赖于另一个模板的模板,如下所示:
template <template<class> class H, class S>
void f(const H<S> &value) {
}
这里,H是一个模板,但我希望这个函数能够处理H的所有特化.
注意:我已经编程c多年,只需要一次.我发现这是一个很少需要的功能(当你需要它时当然很方便!).
我一直试图想出好的例子,说实话,大部分时间这都不是必要的,但让我们设想一个例子.让我们假装std :: vector没有typedef value_type.
那么如何编写一个可以为向量元素创建正确类型变量的函数呢?这会奏效.
template <template<class, class> class V, class T, class A>
void f(V<T, A> &v) {
// This can be "typename V<T, A>::value_type",
// but we are pretending we don't have it
T temp = v.back();
v.pop_back();
// Do some work on temp
std::cout << temp << std::endl;
}
注意:我们std :: vector有两个模板参数,type和allocator,所以我们必须接受它们.幸运的是,由于类型推导,我们不需要明确地写出确切的类型.
您可以这样使用:
f<std::vector, int>(v); // v is of type std::vector<int> using any allocator
或者更好,我们可以使用:
f(v); // everything is deduced, f can deal with a vector of any type!
更新:即使是这个人为的例子,虽然是说明性的,但由于c 11引入了自动化,它不再是一个惊人的例子.现在相同的功能可以写成:
template <class Cont>
void f(Cont &v) {
auto temp = v.back();
v.pop_back();
// Do some work on temp
std::cout << temp << std::endl;
}
这是我更喜欢写这种类型的代码.
标签:template-templates,c,templates 来源: https://codeday.me/bug/20190911/1803867.html