1

我不完全确定如何用英语表达这个,但我想做这样的事情:

template <class T>
class derived: public T
{ blah };

基本上,我有一个模板类,但我从模板中指定的类派生一个新类?即,所以我不一定在编译时知道该类。

这甚至可能吗?
如果是这样,这个的语义是什么?

例如,假设我正在尝试编写一个“父”类。出于本示例的目的,假设它是一个树父级。树的父级是树本身(因此它继承自树),但也有一个对子树的引用向量。
但是,父类本身不一定是树;它可以是任何类,这样我就可以编写如下内容:

Parent<tree> treeParent;
Parent<shrub> shrubParent;
4

5 回答 5

3

是的。这是可能的。尝试这样做。

我不一定在编译时就知道这个类。

我认为,您的意思是“在定义类模板时我不一定知道该类。”

编译时,您已经定义了类模板,并在代码中使用它,将模板参数传递给它,这意味着您在编译时就知道类(即模板参数)。如果您不知道要用作的类base,那么您甚至无法编译代码。

于 2012-01-20T18:16:49.317 回答
3

这确实是可能的,并且通常用于基于策略的设计

就像在这个令人难以置信的人为示例中一样:

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。这样,策略可以用其他方法装饰它所使用的类。

于 2012-01-20T18:23:37.557 回答
1

是的,这是可能的。此语义与类模板中模板参数的任何其他使用的语义没有什么不同。你可以有一个 T 类型的成员,一个 T 类型的函数参数,你也可以有 T 作为一个基类。这并不特别。

于 2012-01-20T18:21:14.560 回答
0

像这样:

#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;
 }
于 2012-01-20T18:30:13.733 回答
0

这是可能的,因为它也很常见并且有自己的名字:Curiously recurring 模板模式。请参阅有关Curiously recurring template pattern 的 Wikipeida 条目

于 2012-01-20T20:04:58.710 回答