模板(Template)

最近阅读google chromium base container stack_container代码,深刻感觉到基础知识不扎实。

// Casts the buffer in its right type.
T* stack_buffer() { return stack_buffer_.template data_as<T>(); }
const T* stack_buffer() const {
  return stack_buffer_.template data_as<T>();
}

关于.template的用法,维基百科关于Template描述中template关键字有详细说明

模板Template)指C++程序设计语言中的函数模板与类模板[1],是一种参数化类型机制,大体对应于java和C#中的泛型,但也有一些功能上的显著差异(C++模板支持后两者没有明确对应的模板模板参数和模板非类型参数,但不支持Java的通配符以及C#的泛型类型约束)。模板是C++的泛型编程中不可缺少的一部分。

模板是C++程序员绝佳的武器,特别是结合了多重继承与运算符重载之后。C++的标准函数库提供的许多有用的函数大多结合了模板的概念,如STL以及iostream。

目录

  • 1 语法
    • 1.1 模板的声明与定义
      • 1.1.1 模板的非类型形参
      • 1.1.2 模板的模板参数
      • 1.1.3 模板参数的默认值
      • 1.1.4 变量模板
    • 1.2 模板的使用
  • 2 示例
    • 2.1 函数模板
    • 2.2 类模板
    • 2.3 模板的嵌套:成员模板
  • 3 依赖名字与typename关键字
  • 4 template关键字
  • 5 别名模板
  • 6 模板实例化
  • 7 参考文献

语法[目录]

模板的声明与定义[目录]

模板定义以关键字template开始,后接模板形参表(template parameter list),模板形参表是用尖括号括住的一个或者多个模板形参的列表,形参之间以逗号分隔。模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非类型形参(non-type parameter)。非类型形参跟在类型说明符之后声明。类型形参跟在关键字class或typename之后声明。模板形参可以给出默认值(default arguments for template parameters)。

模板的非类型形参[目录]

模板的非类型形参(template non-type parameter)允许为下述形式:

  • 整型或枚举型
  • 到对象的指针或函数指针
  • 到对象的引用或函数引用
  • 成员指针

模板的非类型参数被声明为数组或函数的,将被转换为指针或函数指针。例如:

 template<int a[4]> struct A { };template<int f(int)> struct B { };int i;int g(int) { return 0;}A<&i> x;B<&g> y;

模板的非类型形参允许用const或volatile限定(而模板的类型形参是不允许cv限定的)。模板的非类型形参是不允许声明为浮点型、class类型、void型。

模板的模板参数[目录]

类模板的模板参数允许是另外一个类模板,这称为模板的模板参数(template template parameter),也译作“模板参数模板”。函数模板不允许有模板的模板参数。例如:

template<template <class T> class X> class A { }; //类模板A的第二个参数是另外一个类模板X
template<class T> class B { };
A<B> a; //模板A的实际使用。其中的B是模板的模板实参(template template argument)

模板参数的默认值[目录]

模板形参可以给出默认值(default arguments for template parameters)。如果一个模板参数给出了默认值,那么模板形参列表中在其后声明的模板参数都应该给出默认值。例如:

template<class T = char, class U, class V = int> class X { }; //编译出错,或者给出U的默认值,或者不给出T的默认值

一个模板的各次声明给出的模板参数的默认值可以累积其效果。例如:

template<class T, class U = int> class A;
template<class T = float, class U> class A;
template<class T, class U> class A {public:T x;U y;
};
A<> a; //a.x is float, and the type of a.y is int

但是如果交换本示例第一行与第二行的次序,将编译报错。因为如果第一个模板参数T有了默认值,此时编译器必须已经知道其后的第二个模板参数U的默认值。

在同一个作用于(scope)中,不能对同一个模板的同一个参数多次声明其默认值。例如:

template<class T = char> class X;
template<class T = char> class X { };//编译报错。如果在本行中不给出模板参数T的默认值将编译通过

模板参数的作用域为从其声明之处至该模板的定义结束之处。因此可以使用一个模板参数作为其后声明的其他模板参数的一部分或默认值。例如:

template<class V, V obj> class C; 
template<class T, class U = T> class D { };

变量模板[目录]

变量模板(variable template)是C++14引入的新的一个种类的模板。可用于在命名空间作用域声明一个变量。例如:

template<class T>
constexpr T pi = T(3.1415926535897932385);  // variable template
template<class T>
T circular_area(T r) // function template
{return pi<T> * r * r; // pi<T> is a variable template instantiation
}

可以在类作用域声明一个静态数据成员:

struct matrix_constants
{template<class T>using pauli = hermitian_matrix<T, 2>; // alias templatetemplate<class T> static constexpr pauli<T> sigma1 = { { 0, 1 }, { 1, 0 } }; // static data member templatetemplate<class T> static constexpr pauli<T> sigma2 = { { 0, -1i }, { 1i, 0 } };template<class T> static constexpr pauli<T> sigma3 = { { 1, 0 }, { 0, -1 } };

};

类的静态数据成员模板,也可以用类模板的非模板数据成员来实现:

struct limits {template<typename T>static const T min; // declaration of a static data member template
};
template<typename T> const T limits::min = { }; // definition of a static data member template
template<class T> class X {static T s; // declaration of a non-template static data member of a class template
};
template<class T> T X<T>::s = 0; // definition of a non-template data member of a class template

变量模板不能用作模板的模板参数(template template arguments)。

模板的使用[目录]

使用模板时,可以在模板名字后面显式给出用尖括号括住的模板实参列表(template argument list)。对模板函数或类的模板成员函数,也可不显式给出模板实参,而是由编译器根据函数调用的上下文推导出模板实参,这称为模板参数推导

如果模板参数使用其默认值,则在模板实参列表中可以忽略它。如果所有的模板参数都使用了默认值,模板实参列表为空,但仍然必须写出成对的尖括号。例如:

template<class T = int> class X { };
X<> a; //编译通过
X b;   //编译报错

对于作为类型的模板实参,不允许是局部类型(local type)、无链接性的类型(type with no linkage)、无名类型(unnamed type)或包括了这三种情形的复合类型。[2]但C++11以及允许本地类型作为模板实参。

示例[目录]

函数模板[目录]

以下以取最大值的函数模板maximum为例。此函数在编译时会自动产生对应参数类型的代码,而不用显式声明。

#include <iostream>template <typename T>
inline const T& maximum(const T& x,const T& y)
{if(y > x){return y;}else{return x;}
}int main(void)
{using namespace std;int a=3,b=7;float x=3.0,y=7.0;//Calling template functionstd::cout << maximum<int>(a,b) << std::endl;         //输出 7std::cout << maximum(a, b) << std::endl;             //自动补充类型声明std::cout << maximum<double>(x,y) << std::endl;  //输出 7return 0;
}

类模板[目录]

以下以将组件指针的操作,封装成类别模板ComPtr为例。
#pragma oncetemplate <typename Ty>
class ComPtr
{
protected:Ty* m_ptr;public:ComPtr(){m_ptr = NULL;}ComPtr(const ComPtr& rhs){m_ptr = NULL;SetComPtr(rhs.m_ptr);}ComPtr(Ty* p){m_ptr = NULL;SetComPtr(p);}~ComPtr(){Release();}const ComPtr& operator=(const ComPtr& rhs){SetComPtr(rhs.m_ptr);return *this;}Ty* operator=(Ty* p){SetComPtr(p);return p;}operator Ty* (){return m_ptr;}Ty* operator->(){return m_ptr;}operator Ty** (){Release();return &m_ptr;}operator void** (){Release();return (void**)&m_ptr;}bool IsEmpty(){return (m_ptr == NULL);}void SetComPtr(Ty* p){Release();m_ptr = p;if (m_ptr){m_ptr->AddRef();}}void Release(){if (m_ptr){m_ptr->Release();m_ptr = NULL;}}
};

模板的嵌套:成员模板[目录]

对于类中的模板成员函数、嵌套的成员类模板,可以在封闭类的内部或外部定义它们。当模板成员函数、嵌套类模板在其封闭类的外部定义时,必须以封闭类模板的模板参数(如果它们也是模板类)和成员模板的模板参数开头。[1]如下例:

template <typename C> class myc{public:template <typename S> C foo(S s);
};//下行需要给出外部类与内部嵌套类的模板形参列表:
template<typename C> template <typename S> C myc<C>::foo(S s){
C var;
return var;   
}int main()
{
float f;
myc<int> v1;
v1.foo(f);
}

C++标准规定:如果外围的类模板没有特例化,里面的成员模板就不能特例化[3]。例如:

template <class T1> class A {template<class T2> class B {template<class T3> void mf1(T3);void mf2();};
};template <> template <class X>class A<int>::B {template <class T> void mf1(T);};template <> template <> template<class T>void A<int>::B<double>::mf1(T t) { }template <class Y> template <>void A<Y>::B<double>::mf2() { } // ill-formed; B<double> is specialized but its enclosing class template A is not

依赖名字与typename关键字[目录]

一个模板中的依赖于一个模板参数(template parameter)的名字被称为依赖名字 (dependent name)。当一个依赖名字嵌套在一个类的内部时,称为嵌套依赖名字(nested dependent name)。一个不依赖于任何模板参数的名字,称为非依赖名字(non-dependent name)。[4]

编译器在处理模板定义时,可能并不确定依赖名字表示一个类型,还是嵌套类的成员,还是类的静态成员。C++标准规定:如果解析器在一个模板中遇到一个嵌套依赖名字,它假定那个名字不是一个类型,除非显式用typename关键字前置修饰该名字。[5]

typename关键字有两个用途:

  1. 常见的在模板定义中的模板形参列表,表示一个模板参数是类型参数。等同于使用class
  2. 使用模板类内定义的嵌套依赖类型名字时,显式指明这个名字是一个类型名。否则,这个名字会被理解为模板类的静态成员名。C++11起,这一用途也可以出现在模板以外,尽管此时typename关键字不是必要的。

在下述情形,对嵌套依赖类型名字不需要前置修饰typename关键字:[6]

  • 派生类声明的基类列表中的基类标识符;
  • 成员初始化列表中的基类标识符;
  • classstructenum等关键字开始的类型标识符

因为它们的上下文已经指出这些标识符就是作为类型的名字。例如:

template <class T> class A: public T::Nested { //基类列表中的T::Nestedpublic:A(int x) : T::Nested(x) {}; //成员初始化列表中的T::Nestedstruct T::type1 m; //已经有了struct关键字的T::type1
};class B{public:class Nested{public:Nested(int x){};};typedef struct {int x;} type1;
};int main()
{A<B> a(101);return 0;
}

template关键字[目录]

template关键字有两个用途:

  1. 常见的在模板定义的开始。
  2. 模板类内部定义了模板成员函数或者嵌套的成员模板类。在模板中,当引用这样的模板成员函数或嵌套的成员模板类时,可以在::(作用域解析)运算符、.(以对象方式访问成员)运算符、->(以指针方式访问成员)运算符之后使用template关键字,随后才是模板成员函数名字或嵌套的成员模板类名字,这使得随后的左尖括号<被解释为模板参数列表的开始,而不是小于号运算符。C++11起,这一用途也可以出现在模板以外,尽管此时template关键字不是必要的。例如:
class A { public:template <class U> class B{public: typedef int INT;};template <class V> void foo(){}
};template <typename T>
int f()
{i=101;T a, *p=&a;return 0;
}int main()
{f<A>();A::B<double>::INT i;  // 自C++11起,也可写作typename A::template B<double>::INT i;
}

别名模板[目录]

别名模板(aliase template)是C++11引入的技术。在C++03标准中,可以用typedef给全特化模板定义新的类型名。但是不允许用typedef施加于偏特化模板上。例如:

template <typename First, typename Second, int Third>
class SomeType;template <typename Second>
typedef SomeType<OtherType, Second, 5> TypedefName; // Illegal in C++03

C++11增加了给偏特化模板增加别名的功能,例如:

template <typename First, typename Second, int Third>
class SomeType;template <typename Second>
using TypedefName = SomeType<OtherType, Second, 5>;

using在C++11中也可用于其他的类型别名的声明:

typedef void (*FunctionType)(double);       // Old style
using FunctionType1 = void (*)(double); // New introduced syntax

模板实例化[目录]

模板实例化template instantiation)是指在编译或链接时生成函数模板或类模板的具体实例源代码。ISO C++定义了两种模板实例化方法:隐式实例化(当使用实例化的模板时自动地在当前代码单元之前插入模板的实例化代码)、显式实例化(直接声明模板实例化)。在C++语言的不同实现中,模板编译模式(模板初始化的方法)大致可分为三种:

  • Borland模型(包含模板编译模式):编译器生成每个编译单元中遇到的所有的模板实例,并存放在相应的目标文件中;链接器合并相同的模板实例,生成可执行文件。为了在每次模板实例化时模板的定义都是可见的,模板的声明与定义放在同一个.h文件中。这种方法的优点是链接器只需要处理目标文件;这种方法的缺点是由于模板实例被重复编译,编译时间被加长了,而且不能使用系统的链接器,需重新设计链接器。
  • Cfront/查询模型(分离Separation)模板编译模式):AT&T公司的C++编译器Cfront为解决模板实例化问题,增加了一个模板仓库,用以存放模板实例的代码并可被自动维护。当生成一个目标文件时,编译器把遇到的模板定义与当前可生成的模板实例存放到模板仓库中。链接时,链接器的包装程序(wrapper)首先调用编译器生成所有需要的且不在模板仓库中的模板实例。这种方法的优点是编译速度得到了优化,而且可以直接使用系统的链接器;这种方法的缺点是复杂度大大增加,更容易出错。使用这种模型的源程序通常把模板声明与非内联的模板成员分别放在.h文件与模板定义文件中,后者单独编译。
  • 混合(迭代)模型:g++目前是基于Borland模型完成模板实例化。g++未来将实现混合模型的模板实例化,即编译器把编译单元中的模板定义与遇到的当前可实现的模板实例存放在相应的目标文件中;链接器的包装程序(wrapper)调用编译器生成所需的目前还没有实例化的模板实例;链接器合并所有相同的模板实例。使用这种模型的源程序通常把模板声明与非内联的模板成员分别放在.h文件与模板定义文件中,后者单独编译。

ISO C++标准规定,如果隐式实例化模板,则模板的成员函数一直到引用时才被实例化;如果显式实例化模板,则模板所有成员立即都被实例化,所以模板的声明与定义在此处都应该是可见的,而且在其它程序文本文件使用了这个模板实例时用编译器选项抑制模板隐式实例化,或者模板的定义部分是不可见的,或者使用template<> type FUN_NAME(type list)的语句声明模板的特化但不实例化。

g++的模板实例化,目前分为三种方式:[7]

  • 不指定任何特殊的编译器参数:按Borland模型写的源代码能正常完成模板实例化,但每个编译单元将包含所有它用到的模板实例,导致在大的程序中无法接受的代码冗余。需要用GNU的链接器删除各个目标文件中冗余的模板实例,不能使用操作系统提供的链接器。
  • 使用-fno-implicit-templates编译选项:在生成目标文件时完全禁止隐式的模板实例化,所有模板实例都显式的写出来,可以存放在一个单独的源文件中;也可以存放在各个模板定义文件中。如果一个很大的源文件中使用了各个模板实例,这个源文件不用-fno-implicit-templates选项编译,就可以自动隐式的生成所需要的模板实例。在生成库文件时这个编译选项特别有用。
  • 使用-frepo编译选项:在生成每个目标文件时,把需要用到的当前可生成的模板实例存放在相应的.rpo文件中。链接器包装程序(wrapper)—collect2将删除.rpo文件中冗余的模板实例并且修改相应的.rpo文件,使得编译器可以利用.rpo文件知道在那里正确放置、引用模板实例,并重新编译生成受影响的目标文件。由操作系统的通用的链接器生成可执行文件。这对Borland模型是很好的模板实例化方法。对于使用Cfront模型的软件,需要修改源代码,在模板头文件的末尾加上#include <tmethods.cc>。不过MinGW中不包含链接器包装程序collect2,故不使用此方法。对于库(library),建议使用显式实例化方法。
  • 另外,g++扩展了ISO C++标准,用extern关键字指出模板实例在其它编译单元中显式声明(这已经被C++11标准接受);用inline关键字实例化编译器支持的数据(如类的虚表)但不实例化模板成员;用static关键字实例化模板的静态数据成员但不实例化其它非静态的模板成员。
  • g++不支持模板实例化的export关键字(此关键字的这个用法已在C++11标准里被取消)。

VC++7.0中必须类模板实例化只有Borland模型;函数模板一般隐式实例化,自5.0版以后也可显式实例化。

参考文献[目录]

  1. ^ 1.0 1.1 MSDN:嵌套的类模板
  2. ^ §14.3.1/2 from the 2003 C++ Standard: A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.
  3. ^ C++11标准:§14.7.3,¶16规定:the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well
  4. ^ C++11标准:§14.6,¶1
  5. ^ C++11标准§14.6,¶2规定:A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.
  6. ^ C++11标准§14.6,¶5规定
  7. ^ Template Instantiation. [2014-09-27]. 

转载于:https://www.cnblogs.com/liaokang/p/5663227.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python异常值均值填充_Python 异常值分析

异常值分析是检验数据是否有录入错误以及含有不合常理的数据。忽视异常值的存在是十分危险的&#xff0c;不加剔除地把异常值包括进数据的计算分析过程中&#xff0c;对结果会产生不良影响&#xff1b;重视异常值的出现&#xff0c;分析其产生的原因&#xff0c;常常成为发现问…

近期学习清单

2019独角兽企业重金招聘Python工程师标准>>> 框架 1.编写xml性质的ioc容器demo&#xff08;附上博文一篇&#xff09; 2.编写unity形式的ioc容器demo&#xff08;附上博文一篇&#xff09; 3.编写自己的orm框架 c#语言特性 1.大量阅读有关枚举类&#xff0c;查询类…

java同名函数_浅谈Java 继承接口同名函数问题

在Java中如果一个类同时继承接口A与B&#xff0c;并且这两个接口中具有同名方法&#xff0c;会怎么样&#xff1f;动手做实验&#xff1a;interface A{void fun();}interface B{void fun();}interface C extends A,B{}public class Test implements C{Overridepublic void fun(…

判断两个树是否互相镜像

// 3. 判断两个树是否互相镜像 public static boolean isMirrorRec(TreeNode r1, TreeNode r2){ // 如果两个树都是空树&#xff0c;则返回true if(r1null && r2null){ return true; } // 如果有一棵树是空树&#xff0c;另一颗不是&#xff0c;则返回false if(…

NopCommerce开源项目中很基础但是很实用的C# Helper方法

NopCommerce是啥&#xff1f; nopCommerce是最好的开源电子商务购物 系统。nopCommerce免费提供。今天&#xff0c;它是最好和最流行的ASP.NET电子商务软件。它已被下载超过180万次&#xff01; nopCommerce是一个完全可定制的购物系统。它稳定且高度可用。nopCommerce是一个开…

java中如何设计答题小系统_java的一点问题,设计一个答题的程序

publicclassTestextendsJFrame{privateJPanelt_1newJPanel();privateJPanelt_0newJPanel();privateJLabelj_1newJLabel("题目1.");privateJLabelanwsernewJLabel("");privateButto...public class Test extends JFrame{private JPanel t_1new JPanel();pri…

写一个函数,输入int型,返回整数逆序后的字符串

2019独角兽企业重金招聘Python工程师标准>>> 刚刚看到一个面试题&#xff1a;写一个函数&#xff0c;输入int型&#xff0c;返回整数逆序后的字符串。如&#xff1a;输入123&#xff0c;返回“321”。 要求必须用递归&#xff0c;不能用全局变量&#xff0c;输入必须…

VS2013 使用QCustomPlot等三方库如何配置

QCustomPlot 是一个小巧好用的 QT 图表插件。用来画曲线图、趋势图、坐标图、柱状图等类似二维图的库。实现大部分的2维图形绘制。使用时&#xff0c;我们在程序中写完相关调用的代码后&#xff0c;只需将 QCunstomPlot.cpp 和 QCustomPlot.h 两个文件加入工程&#xff0c;正常…

Php RSS

RSS 聚合最近非常流行&#xff0c;因此至少对 RSS 及其工作方式有所了解是一名 PHP 开发人员的迫切需要。本文介绍了 RSS 基础知识、RSS 众多用途中的一些用途、如何使用 PHP 从数据库创建 RSS 提要&#xff0c;以及如何使用 XML_RSS 模块读取现有 RSS 提要并将其转换为 HTML。…

java 获取cer证书指纹_获取SSL证书的指纹

每一张SSL证书都有指纹(fingerprint)信息&#xff0c;若要获取&#xff0c;可以通过openssl或者certutil工具&#xff0c;分别在非Windows和Windows平台下使用基本语法&#xff1a;openssl x509 -fingerprint -in cerfile.crt若是报无法读取文件&#xff0c;那么极有可能是未指…

分布式配置管理平台Disconf

2019独角兽企业重金招聘Python工程师标准>>> 摘要 为了更好的解决分布式环境下多台服务实例的配置统一管理问题&#xff0c;本文提出了一套完整的分布式配置管理解决方案&#xff08;简称为disconf[4]&#xff0c;下同&#xff09;。首先&#xff0c;实现了同构系统…

1.ELF之Elf Header

1.ELF的三个文件头 每个ELF文件有三个文件头&#xff0c;用来索引信息。 (1).EH ELF file Header 可在此读到PH&#xff0c;SH在文件中的offset。 (2).PH Program Header 与load program有关的索引&#xff0c;.o的PH为空。 (3).SH Section Header 组成此文件的所有secti…

UVA 11825 状态压缩DP+子集思想

很明显的状态压缩思想了。把全集分组&#xff0c;枚举每个集合的子集&#xff0c;看一个子集是否能覆盖所有的点&#xff0c;若能&#xff0c;则f[s]max(f[s],f[s^s0]1)。即与差集1比较。 这种枚举集合的思想还是第一次遇到&#xff0c;果然太弱了。。。。~~~~ 其中枚举集合 fo…

java路径1.7_Java环境配置原理详解1.Jdk安装目录文件说明:一般jdk安装目录及路径 Javajdk1.7.0_79lib,里面主要包含以下文件夹。bin...

Java环境配置原理详解1.Jdk安装目录文件说明&#xff1a;一般jdk安装目录及路径 Javajdk1.7.0_79lib&#xff0c;里面主要包含以下文件夹。bin&#xff1a;主要存放的是java工具中常用命令如&#xff1a;java&#xff0c;javac等。db&#xff1a;安装java db的路径。include&am…

Centos下Nodejs+npm环境-部署记录

公司的一个项目上线&#xff0c;需要用到Nodejs和npm环境&#xff0c;这里记录下安装过程&#xff0c;方便回看同时供大家参考。 1&#xff09;yum安装方式&#xff08;版本比较老点&#xff0c;v5.12.0 3.8.6&#xff09; 需要在centos中添加epel和remi源添加epel源&#xff…

AngularJS 事件

ng-click 指令 ng-click 指令定义了 AngularJS 点击事件。 <!DOCTYPE html> <html><head><meta charset"utf-8"><script src"http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script></head>&l…

[LeetCode] #22 Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 本题是括号…

匹配字符串-好技能-正则表达式

1. 正则表达式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号&#xff0c;都是"普通字符"。表达式中的普通字符&#xff0c;在匹配一个字符串的时候&#xff0c;匹配与之相同的一个字符。 举例1&#xff1a;表达式 "c&q…

在java中图片随机播放_java-以相同顺序随机播放多个文件

接下来仅使用基本的bash命令.原则是&#xff1a;>生成随机顺序(数字)>按此顺序订购所有文件编码#!/bin/bashcase "$#" in0) echo "Usage: $0 files....." ; exit 1;;esacORDER"./.rand.$$"trap "rm -f $ORDER;exit" 1 2count$(g…

2018年5月5日论文阅读

国外精读&#xff01;title&#xff08;27&#xff09;&#xff1a;We don’t need no bounding-boxes: Training object class detectors using only human verification&#xff08;我们不需要任何边界框&#xff1a;只使用人工验证来训练对象类别检测器&#xff09;---20170…