C++ C<;T>;源自T,安全吗?

C++ C<;T>;源自T,安全吗?,c++,c++11,templates,inheritance,C++,C++11,Templates,Inheritance,我有一个问题可以很好地解决,如果我可以为某个类C指定一个基类(C派生自T) 我以前从未这样做过,所以我创建了一个简短的测试用例并进行了测试 #包括 使用名称空间std; B类{ 公共:int k=5; }; 模板类C:公共T{}; int main(){ C C; std::cout这不是“在C++的边缘”,但是如果T是一种可以派生的类型,那么它是完全合法的。我不知道这个“模式”有什么具体的名称 请注意,您可以从std::remove_reference\t派生(以使C等内容有效)或者将其保留为

我有一个问题可以很好地解决,如果我可以为某个类
C
指定一个基类(
C派生自T

我以前从未这样做过,所以我创建了一个简短的测试用例并进行了测试

#包括
使用名称空间std;
B类{
公共:int k=5;
};
模板类C:公共T{};
int main(){
C C;
std::cout这不是“在C++的边缘”,但是如果
T
是一种可以派生的类型,那么它是完全合法的。我不知道这个“模式”有什么具体的名称


请注意,您可以从
std::remove_reference\t
派生(以使
C
等内容有效)或者将其保留为
T
,以使
C
等编译失败-这取决于情况。

FYI:@Nicky C谢谢!哇,它被广泛使用!@NickyC:这是一种基类接收派生类作为模板参数的模式。从模板参数派生的方式并不完全相同。这看起来类似,但有点不同ENT比具有模式<代码>类D:公共B<代码>的CRTP,这样基类可以使用派生类的功能。@ HaveARD: C++中有很多东西是编译器允许的(甚至可以是合法的、有效的代码)这是值得关注的。你能回答最后一个问题吗?XD@javaLover:它没有名字。CRTP与您正在做的相反。在CRTP中,您的类型
T
源自
C
@nicolabolas。它有一个名字,不是最简单形式的混音吗?@skypjack谢谢。同意(+)。您可以将其作为解决方案发布(对于最后一个未回答的问题)如果你愿意的话。如果愿意,我会投票给你。@javaLover我不想在这上面寻找名声,如果Pixelchemist在答案中加上这个名字,那是值得的。试着打他一下。;-)
#include <iostream>
using namespace std;

class B{
    public: int k=5;
};
template<class T> class C : public T{};

int main() {
    C<B> c;
    std::cout<<c.k<<std::endl;
    return 0;
}