Использование статических переменных с шаблонами - PullRequest
2 голосов
/ 03 февраля 2012

Я пытаюсь создать шаблонный класс, который содержит статический список объектов, среди которых есть только один. То, что у меня есть, работает, но оно дает мне копию «mylist» для каждого типа параметра класса B. Как я могу изменить его так, чтобы я получил один «mylist» для всех экземпляров класса B независимо от параметров шаблона?

Вот что у меня есть:

template <class T> class A {
    ...
};
template <class T> class B {
    static list<A<T> > mylist;
    ...
};
template <class T> list< A<T> > B<T>::mylist;

Заранее спасибо:)

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Как это изменить, чтобы у меня была только ОДНА копия

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

... что содержит любой тип?

Это зависит от ваших ожиданий. Я собираюсь предположить из вашего примера, что «любой тип» означает «любое создание шаблона класса A».

Поскольку эти типы могут различаться по размеру, лучше всего удерживать указатели на объекты.

Это один пример решения, которое решило бы обе эти проблемы.

class ACommon {
    // Put a common virtual interface here.
};

template <class T> class A : public ACommon {
};

class BCommon {
    // You'll have a single, common static here.

    static list<shared_ptr<ACommon> > mylist;
};

template <class T> class B : public BCommon{

};
1 голос
/ 03 февраля 2012

Вы не можете «просто» иметь ЛЮБОЙ тип в списке, живя рядом.В зависимости от того, что вы ожидаете сделать с этим списком, и с объектами в нем, есть несколько вещей, которые нужно сделать.

Альтернативой решению Дрю будет: Вам определенно потребуется BCommon, если вы хотите один списокдля всех экземпляров.Если вы не хотите скрывать свои типы A за интерфейсом, вы можете использовать Boost :: any или Boost :: option для хранения ваших объектов A.

...