C ++: Могу ли я написать шаблонный класс, производный от T? - PullRequest
1 голос
/ 20 января 2012

Я не совсем уверен, как сказать это по-английски, но я хочу сделать что-то вроде этого:

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

Где в принципе у меня есть шаблонный класс, но я извлекаю новый класс из класса, который указан в шаблоне? То есть поэтому я не обязательно знаю класс во время компиляции.

Это вообще возможно?
Если это так, какова семантика для этого?

Например, скажем, я пытаюсь написать «родительский» класс. Для целей этого примера предположим, что это родительский элемент дерева. Родитель дерева - это само дерево (поэтому оно наследуется от дерева), но также имеется вектор ссылок на дочерние деревья.
Однако сам родительский класс не обязательно должен быть деревом; это может быть любой класс, такой, что я мог бы написать что-то вроде:

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

Ответы [ 5 ]

3 голосов
/ 20 января 2012

Это действительно возможно и обычно используется для проектирования на основе политики :

Как в этом невероятно надуманном примере:

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.Таким образом, политика может украсить класс, в котором она используется, с помощью дополнительных методов.

3 голосов
/ 20 января 2012

Да.Это возможноПопробуйте сделать это.

Я не обязательно буду знать класс во время компиляции.

Я думаю, вы имеете в виду "Я не обязательно знаюкласс во время определения шаблона класса . "

Ко времени компиляции вы уже определили шаблон класса и использовали его в своем коде, передавая шаблонаргумент этому, что означает, что вы знаете класс (то есть аргумент шаблона) во время компиляции.Если вы не знаете, какой класс будет использоваться как base, вы даже не сможете скомпилировать код.

1 голос
/ 20 января 2012

Да, это возможно. Семантика для этого не отличается от семантики для любого другого использования параметра шаблона в шаблоне класса. Вы можете иметь член типа T, параметр функции типа T, и вы также можете иметь T в качестве базового класса. Это не особенное.

0 голосов
/ 21 января 2012

Это возможно, но это также очень распространено и получило свое собственное имя: шаблон Curiously recurring template.См. Запись Wikipeida о странно повторяющемся шаблоне .

0 голосов
/ 20 января 2012

Как это:

#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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...