我不知道如何用英语表达这个词,但我想做这样的事情:
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关于"奇怪的重复模板模式"的条目。