c++ 模板特例化问题 zszs

c++ function类的定义是类似这样的

 template<typename T> class function;

 template<typename R, typename... T>
 class function<R(T)>
 {
 };

这里大概是模板特例化了,不过让人疑惑的是R(T)这部分,这是什么,我自己写了一个试了下:

 template<typename R> class A;

template<typename R, int T> 
class A<R[T]>
{
public:
    A()
    {
        for(int i=0;i<T;i++){
            a[i] = i;
        }
    }
    R a[T];
};


int main()
{
    A<int[10]> a;
    for(int i=0;i<10;i++){
        printf("%d\n", a.a[i]);
    }
    return 0;
}

上面代码是可以正常运行的,有谁可以解释下这什么原理。

类型R 的数组 长度为T
类A有 字段 a 为类型R的数组,即 R a[T];
类A R[] 和 一个构造函数

外部模板
传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要出发模板实例化。
C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使得能够显式的告诉编译器何时进行模板的实例化:
template class std::vector; // 强行实例化
extern template class std::vector; // 不在该编译文件中实例化模板
在了解类型别名模板之前,需要理解『模板』和『类型』之间的不同。仔细体会这句话:模板是用来产生类型的。在传统 C++中,typedef 可以为类型定义一个新的名称,但是却没有办法为模板定义一个新的名称。因为,模板不是类型。例如:

template< typename T, typename U, int value>
class SuckType {
public:
T a;
U b;
SuckType():a(value),b(value){}
};
template< typename U>
typedef SuckTypestd::vector<int, U, 1> NewType; // 不合法
C++11 使用 using 引入了下面这种形式的写法,并且同时支持对传统 typedef 相同的功效:

通常我们使用 typedef 定义别名的语法是:typedef 原名称 新名称;,但是对函数指针等别名的定义语法却不相同,这通常给直接阅读造成了一定程度的困难。
typedef int (*process)(void ); // 定义了一个返回类型为 int,参数为 void 的函数指针类型,名字叫做 process
using process = int(*)(void *); // 同上, 更加直观

template
using NewType = SuckType; // 合法

类模板有两个参数,R有关键字typename说明R是一种类型,你用int T作第二参数,说明T是一个变量。当你用int[10]初始化模板时,对应class就可以知道TR是int []类型,T赋值为常量10。

类模板有两个参数,R有关键字typename说明R是一种类型,你用int T作第二参数,说明T是一个变量。当你用int[10]初始化模板时,对应class就可以知道TR是int []类型,T赋值为常量10。

楼上说得贼有道理,对对对。。。