C++:我可以写一个从T派生的模板类吗
C++: Can I write a template class that derives from T?
我不知道如何用英语表达这个词,但我想做这样的事情:
template <class T>
class derived: public T
{ blah };
基本上,我有一个模板类,但我正在从模板中指定的类派生一个新类?也就是说,所以在编译时我不一定知道这个类。
这可能吗
如果是,那么它的语义是什么
例如,假设我正在尝试编写一个"家长"类。为了这个例子的目的,假设它是一个树的父级。树的父级是树本身(因此它继承自树),但也有一个子树的引用向量
但是,父类本身不必是树;它可以是任何类,这样我就可以写这样的东西:
Parent<tree> treeParent;
Parent<shrub> shrubParent;
是。这是可能的。试着这样做。
在编译时我不一定知道这个类。
我想,你的意思是"在定义类模板时,我不一定知道类。"
编译时,您已经定义了类模板,并在代码中使用它,将模板参数传递给它,这意味着您在编译时就知道了类(即模板参数)。如果您不知道要用作base
的类,那么您甚至无法编译代码。
这确实是可能的,并且通常用于基于策略的设计:
就像这个令人难以置信的人为例子:
template<typename OutputPolicy>
struct Writer : public OutputPolicy {
using OutputPolicy::print;
void write(const std::string&) {
//do some formatting etc.
print(string);
}
};
class StdoutPolicy {
public:
set_linebreaks(const std::string&);
protected:
void print(const std::string&);
};
策略中的公共方法将可通过Writer
访问。这样,策略就可以用其他方法来修饰它所使用的类。
是的,这是可能的。这一点的语义与类模板中模板参数的任何其他使用的语义没有什么不同。你可以有一个T类型的成员,一个T型的函数参数,你也可以把T作为基类。这并不特别。
像这样:
#include <iostream>
using namespace std;
template<typename T>class classTemplateBase
{
public:
T value;
classTemplateBase(T i)
{
this->value = i;
}
void test()
{
cout << value << endl;
}
};
class classTemplateChild : public classTemplateBase<char>
{
public:
classTemplateChild( ): classTemplateBase<char>( 0 ) // default char is NUL
{
;
}
classTemplateChild(char c): classTemplateBase<char>( c )
{
;
}
void test2()
{
test();
}
};
int main()
{
classTemplateBase <int> a( 42 );
classTemplateChild b( 'A' );
a.test(); // should print "42"
b.test(); // should print "A"
b.test2(); // should print "A"
return 0;
}
这可能是因为它也很常见,并有自己的名字:奇怪的重复模板模式。请参阅Wikipeida关于"奇怪的重复模板模式"的条目。
相关文章:
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 如何将一个变量用于父类和派生类
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 用于从一个基派生的类的GDB漂亮的打印机
- 存储在一个通用容器中的派生对象.如何避免铸造
- C++多态性:如何测试一个类是否派生自另一个基类
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 如果我们有一个基*类,如何访问派生模板类的成员函数
- 无法从派生类型的作用域访问另一个实例的受保护成员
- C 有一个关键字,允许从派生类引用基本类型
- 从一个函数和某些类型指定符定义整个派生类的宏
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)
- 在C++中从模板类本身派生一个模板类
- 在c++中基于另一个变量类型派生一个变量类型