当前位置: 首页 > 知识库问答 >
问题:

模板专门化和从其他模板类继承模板类

聂奇
2023-03-14

关于下一个代码,我有一些问题:

template<typename T>
class Base;

template<typename T, typename P>
class Base<T(P)> {

};

template<typename T>
class Derived;

template<typename T, typename P>
class Derived<T(P)> : public Base<T(P)> {

};

>

  • 类专业化派生

    当我绑定类专用化的模板参数TP时,名称是什么 派生


  • 共有2个答案

    禄源
    2023-03-14
    匿名用户

    > < li>

    从派生的模板< code >实例化的类

    这就是所谓的继承。那里没有什么特别的事情。您只是用T(P)类型实例化模板Base并从结果类继承。

    基础

    您可能会感到困惑,以为< code>T(P)是某种特殊的模板。它不是。它只是“返回< code>T并接受< code>P类型的单个参数”的类型函数。当然,这种类型在模板之外很少出现,但是在其他地方它们是完全合法的。即

    using FuncType = void(int);
    
    // These two declarations are exactly the same
    void doAThing(FuncType* callback);
    void doAThing(void(*callback)(int));
    

    斜光耀
    2023-03-14
      < li >类专门化<代码>派生

    从技术上讲,两者都不是。类或类模板永远不会继承自模板,只会继承自一种特定的基类类型。也就是说,派生

    如果我稍微改变一下你的例子,

    template<typename T> // #1
    class Base;
    
    template<typename T, typename P> // #2
    class Base<T(P)> {
    public:
        static const int mem1 = 1;
    };
    
    template<typename T>
    class Derived;
    
    template<typename T, typename P>
    class Derived<T(P)> : public Base<T(P)> {
    };
    
    class SomethingElse {};
    
    template<typename P> // #3
    class Base<SomethingElse(const P&)> {
    public:
        static const long long mem2 = 2;
    };
    
    using ThingType = Derived<SomethingElse(const std::string&)>;
    const auto A = ThingType::mem1; // Error!
    const auto B = ThingType::mem2; // OK
    

    说部分专业化派生是不正确的

    除了使用依赖复合类型之外,我不知道这方面的任何术语。(依赖=取决于一个或多个模板参数;复合=类型T(P)涉及其他类型TP)这也使得<code>成为基础

     类似资料:
    • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

    • Jinja 最为强大的地方在于他的模板继承功能,模板继承允许你创建一个基础的骨架模板, 这个模板包含您网站的通用元素,并且定义子模板可以重载的 blocks 。 听起来虽然复杂,但是其实非常初级。理解概念的最好方法就是通过例子。 基础模板 在这个叫做 layout.html 的模板中定义了一个简单的 HTML 文档骨架,你可以 将这个骨架用作一个简单的双栏页面。而子模板负责填充空白的 block:

    • 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填充 extends继承:继承,写在模板文件的第一行 定义父模板base.html { % block block_name % } 这里可以定义默认值 如果不定义默认值,则表示空字符串 { %

    • Jade 支持通过 block 和 extends 关键字来实现模板继承。 一个块就是一个Jade的"block" ,它将在子模板中实现,同时是支持递归的。 Jade 块如果没有内容,Jade会添加默认内容,下面的代码默认会输出block scripts, block content, 和 block foot. html head h1 My Site - #{title}

    • 继承 继承能够创建可复用的模板,定义页面的骨架,然后被子模板填充,子模板又可以作为父模板被继承。 继承主要通过两个标签语法实现 <t:template> 定义要继承的父模板 <b:block> 在父模板中用来定义可以被填充的区域;在子模板中用来定义将内容填充到父模板的指定区域 定义父模板 layout.vdt <div> <b:header> <div>父模板头部</div> </

    • 模板继承是 ThinkCMF推荐一种布局方式,它比上一篇讲的模板布局更灵活;模板继承就是你先定义一个基础的模板,在这个基础模板你可以设置很多个区块( block),然后在其它实际要渲染的子模板文件中用 extend标签继承这个基础模板,在子模板中定义name相同的 block,这样就可以对基础模板中定义的区块进行重载; 每个区块都是<block></block>这样的标签,如: <block na