ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-11 06:08:18  阅读:209  来源: 互联网

标签:template-templates c templates


我已经看到了一些使用模板模板参数(即以模板作为参数的模板)来进行基于策略的类设计的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有