c++ - 来自不同特化的模板类继承

标签 c++ templates inheritance specialization

这是出于对 C++ 规则的好奇而提出的问题,没有任何实际应用。在使用模板时,我创建了一个类层次结构,如下所示:

#include <stdio.h>

// Declaration
template <int X = 0>
struct A;

// Specialization for X = 0
template <>
struct A<0>
{
    virtual void foo()
    {
        printf("A<0>::foo()\n");
    }
};

// Extended generalized implementation
template <int X>
struct A : public A<0>
{
    virtual void foo()
    {
        printf("A<1>::foo()\n");
    }

    virtual void bar()
    {
        printf("A<1>::bar()\n");
    }
};

int main()
{
    A<> a0;
    A<1> a1;

    a0.foo();
    a1.foo();
    a1.bar();

    return 0;
}

此代码在 Visual Studio 上编译良好并产生预期的输出:

A<0>::foo()
A<1>::foo()
A<1>::bar()

这是有效的 C++ 设计实践吗?这对我来说当然看起来很奇怪,所以我想知道这是否是某种未定义的行为,它恰好取决于编译器,有很多陷阱和陷阱,或者它是否是模板的定义明确的用法。

看到这方面的任何实际例子会很有趣。

最佳答案

这是定义 template 时经常使用的标准技术。递归地。

这种技术的一个例子是整数序列:

template<int...s> struct seq {typedef seq<s...> type;};

特别是在他们这一代:

template<int max, int... s> struct make_seq:make_seq<max-1, max-1, s...> {};
template<int... s> struct make_seq<0, s...>:seq<s...> {};

这是通过从 template 的不同实例继承来递归和简单地描述的.

明确地说,make_seq<7>::typeseq<0,1,2,3,4,5,6>通过 7 级递归继承。

关于c++ - 来自不同特化的模板类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571667/

相关文章:

c++ - 什么是段错误?

android - 用于 linux 平台的中间件 android 开发的模拟器

c++ - std::shared_ptr 类工厂 C++

c++ - 语法分解问题

c++ - 在什么情况下 glGenBuffers/glGenBuffersARB 会失败?

c++ - 将直接字符串传递给 C++ 中的模板

c++ - 命名空间和类中的可变参数模板函数

c++ - 为基本数据类型和 Eigen 数据类型编写模板函数

c# - 如何将实现公共(public)接口(interface)的集合添加在一起

c# - 使用其中的代码创建 mustoveride 函数