小编典典

模板模板参数有哪些用途?

all

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


阅读 96

收藏
2022-04-29

共1个答案

小编典典

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

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

您可以像这样使用它:

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;
}

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

2022-04-29