Массив шаблонного типа в C ++ - PullRequest
0 голосов
/ 17 августа 2011

У меня есть следующее:

QFutureWatcher<bool> *procwatcher;
procwatcher = new QFutureWatcher<bool>();
QFuture<bool> procfuture = QtConcurrent::run(this, &EraserBatch::processTile);
procwatcher->setFuture(procfuture);

  QFutureWatcher<bool> *procwatcher2;
  procwatcher2 = new QFutureWatcher<bool>();
  QFuture<bool> procfuture2 = QtConcurrent::run(this, &EraserBatch::processTile);
  procwatcher2->setFuture(procfuture2);

Каков синтаксис для создания динамически изменяемого массива этих двух типов - QFutureWatcher и QFuture, чтобы я мог сказать procwatcher [0] и procfuture [1],и т.д.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 17 августа 2011

Пока шаблон полностью специализирован (т.е. все параметры шаблона указаны), вы можете просто сделать это:

#include <vector> // required for std::vector

std::vector<QFutureWatcher<bool>*> procWatchers;

Хотя в соответствии с тем, как QFutureWatcher используется в эти примеры документации , вы, вероятно, захотите хранить QFutureWatcher экземпляров в std::vector вместо:

std::vector<QFutureWatcher<bool> > procWatchers;

Таким образом, вам не придется вручную new и deleteQFutureWatcher экземпляров.

Очевидно, QFutureWatcher наследуется от QObject, что не копируется .Это мешает std::vector<QFutureWatcher<bool> > работать.


У вас есть это:

QFutureWatcher<bool> *procwatcher;
procwatcher = new QFutureWatcher<bool>();
QFuture<bool> procfuture = QtConcurrent::run(this, &EraserBatch::processTile);
procwatcher->setFuture(procfuture);

QFutureWatcher<bool> *procwatcher2;
procwatcher2 = new QFutureWatcher<bool>();
QFuture<bool> procfuture2 = QtConcurrent::run(this, &EraserBatch::processTile);
procwatcher2->setFuture(procfuture2);

Вы можете сделать что-то вроде этого:

// Not tested!

// Bundle QFutureWatcher and QFuture together.
template<typename T>
struct FutureStruct
{
    FutureStruct(QFutureWatcher<T>* w, const QFuture<T>& f)
        : watcher(w), future(f)
    {
        this->watcher->setFuture(this->future);
    }

    QFutureWatcher<T>* watcher; // Apparently QObjects can't be copied.
    QFuture<T> future;
};

// ...

std::vector< FutureStruct<bool> > futures;

// ...

void AddFuture()
{
    futures.push_back(FutureStruct<bool>(new QFutureWatcher<bool>(),
        QtConcurrent::run(this, &EraserBatch::processTile)));
}

// ...

futures[0].watcher; // gets you the first QFutureWatcher<bool>*
futures[0].future;  // gets you the first QFuture<bool>

futures[1].watcher; // gets you the second QFutureWatcher<bool>*
futures[1].future;  // gets you the second QFuture<bool>

// ...

Конечно, потому чтоQFutureWatcher<bool> было выделено с new, вам нужно delete, прежде чем исчезнет вектор futures:

for(std::vector< FutureStruct<bool> >::iterator i = futures.begin();
    i != futures.end(); ++i)
{
    delete i->watcher;
}
2 голосов
/ 17 августа 2011

RAII способ, если наблюдатели принадлежат не только вектору:

typedef boost::shared_ptr<QFutureWatcher<bool> > ProcWatcherPtr;
std::vector<ProcWatcherPtr> procWatchers;

Путь RAII, если наблюдатели принадлежат только вектору:

typedef QFutureWatcher<bool> ProcWatcher
boost::ptr_vector<ProcWatcher> procWatchers;

или без выделения памяти, если это соответствует вашим потребностям:

std::vector<QFutureWatcher<bool> > procWatchers;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...