我见过一些使用模板模板参数(即以模板作为参数的模板)进行基于策略的类设计的 C++ 示例。这种技术还有什么其他用途?
我认为您需要使用模板模板语法来传递一个参数,其类型是一个依赖于另一个模板的模板,如下所示:
template <template<class> class H, class S> void f(const H<S> &value) { }
这里,H是一个模板,但我希望这个函数能够处理H.
H
注意 :我已经编写 c++ 多年,并且只需要一次。我发现这是一个很少需要的功能(当你需要它时当然很方便!)。
我一直在努力想出好的例子,老实说,大多数时候这不是必需的,但让我们设计一个例子。让我们假设std::vector 没有typedef value_type.
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有两个模板参数,类型和分配器,所以我们必须接受它们。幸运的是,由于类型推导,我们不需要显式写出确切的类型。
您可以像这样使用它:
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. 现在同样的函数可以写成:
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; }
这就是我更喜欢编写这种类型的代码的方式。