栗悟饭和龟仙人 2017-10-27 09:22 采纳率: 25%
浏览 1547
已采纳

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

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

  • 写回答

4条回答 默认 最新

  • 犹新 2017-10-27 10:03
    关注

    类型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; // 合法

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退