Как возможно, чтобы класс был получен из специализированного шаблона? - PullRequest
5 голосов
/ 29 января 2012

Я не знаю, как это описать, но это код:

class A : public std::vector<A>
{
};

//....

A a;
a.push_back(a);

Что это делает и зачем ты это делаешь?

Ответы [ 3 ]

4 голосов
/ 29 января 2012

Это странно повторяющийся шаблон (CRTP) .
Это позволяет реализовать статический полиморфизм .

Однако использование std::vector в качестве базового класса является плохой практикой, поскольку в нем нет виртуального деструктора.

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

Поскольку это вектор A с, а не A* с, a не может содержать сам по себе.Но это push_back добавит к вектору копию a во время вызова.

Пример:

#include <vector>
#include <iostream>
using namespace std;
class A : public std::vector<A>
{
    public:
        void print(int level=0){
            for (int i=0;i<level;i++) cout<<"  ";
            cout << "0x" << hex << (unsigned int)this << "=[";
            if (size()){
                cout  << endl;
                for (int i=0; i<size(); i++)
                    (*this)[i].print(level+1);
                for (int i=0;i<level;i++) cout<<"  ";
            }
            cout <<"]"<<endl;
            if(!level) cout << endl;
        }

};

int main(){
    A a;
    for (int i=1;i<=3;i++){
        a.push_back(a);
        a.print();
    }
    return 0;
}

И вывод:

0xbff4fa20=[
  0x9ec2008=[]
]

0xbff4fa20=[
  0x9ec2018=[]
  0x9ec2024=[
    0x9ec2038=[]
  ]
]

0xbff4fa20=[
  0x9ec2048=[]
  0x9ec2054=[
    0x9ec20a0=[]
  ]
  0x9ec2060=[
    0x9ec2080=[]
    0x9ec208c=[
      0x9ec2008=[]
    ]
  ]
]
0 голосов
/ 29 января 2012

Подкласс должен завершить родовые типы. Вектор может содержать только объекты типа A, а не произвольные векторы.

Теперь, почему вы строите объект, содержащий себя, я не знаю. Но есть причины для этого. Например, для модульного тестирования, чтобы убедиться, что алгоритм способен обрабатывать коллекции, содержащие циклы. Наивный алгоритм, вероятно, попадет в бесконечный цикл, поэтому не пройдёт модульный тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...