gpt4 book ai didi

c++ - 模板模板参数有哪些用途?

转载 作者:IT老高 更新时间:2023-10-28 11:26:50 26 4
gpt4 key购买 nike

我见过一些使用模板模板参数(即以模板作为参数的模板)进行基于策略的类设计的 C++ 示例。这种技术还有什么其他用途?

最佳答案

我认为你需要使用模板模板语法来传递一个参数,其类型是一个依赖于另一个模板的模板,如下所示:

template <template<class> class H, class S>
void f(const H<S> &value) {
}

这里,H 是一个模板,但我希望这个函数能够处理 H 的所有特化。

注意:我从事 c++ 编程多年,只需要一次。我发现它是一个很少需要的功能(当你需要它时当然很方便!)。

我一直在努力想出好的例子,老实说,大多数时候这不是必需的,但让我们设计一个例子。让我们假设 std::vector 没有typedef value_type

那么你将如何编写一个函数来为 vector 元素创建正确类型的变量?这会奏效。

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 有两个模板参数,类型和分配器,所以我们必须同时接受它们。幸运的是,由于类型推导,我们不需要显式写出确切的类型。

你可以这样使用:

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 引入了 auto,它不再是一个令人惊奇的例子。现在同样的函数可以写成:

template <class Cont>
void f(Cont &v) {

auto temp = v.back();
v.pop_back();
// Do some work on temp

std::cout << temp << std::endl;
}

这就是我更喜欢编写这种类型的代码的方式。

关于c++ - 模板模板参数有哪些用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/213761/

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