2015-10-16 2 views
0

Предположим, у нас есть шаблон класс ptr. Функция-конструктор класса ptr может принимать значения int, double, other handmade structure и т. Д., Так как это класс шаблона.Как увеличить статическое значение int в классе шаблона внутри функций-конструкторов и деструкторов?

Я хочу видеть, сколько раз эти конструкторы и деструкторы вызываются, и также тип данных, к которым он был вызван. Можно ли это увидеть?

Прямо сейчас у меня есть статическое значение int в классе шаблона и 2 конструктора (1 конструктор по умолчанию) и 1 деструкторы, в которых я увеличиваю/уменьшаю значение статического значения int.

template<class T> 
class ptr 
{ 
private: 
    T* data; 
public: 
    ptr(); 
    ptr(T* data); 
    ~ptr(); 
    static int number; 
}; 

template<class T> 
int ptr<T>::number = 0; 

Как я могу видеть, для которых эти типы Конструкторы и деструктор называются? Теперь я вижу значение статического int, а не для какого типа он вызывается.

+0

Каждый тип, который вы используете, создаст новый тип. a 'ptr ' будет другим классом, чем 'ptr ' – NathanOliver

+0

Да. Вот почему для каждого класса существует более 1 статического числа, поэтому я хочу видеть, какой из них я увеличиваю или уменьшаю. – yamato

+0

'ptr :: number' дает вам количество' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Вы можете проверить и добавить это для нескольких типов. Если вам нужна сумма всех типов, вы должны сделать отдельную переменную, так как нет способа спросить, с какими типами был создан шаблон. – nwp

ответ

1

Я хочу видеть точно, сколько раз эти конструкторы и деструкторы вызываются ...

Ну, это легко, вы храните этот номер в ptr<T>::number, да так, что можно увидеть. Например, чтобы узнать, сколько раз было создано ptr<Foo>, используйте ptr<Foo>::number.

, а также тип данных, он был призван на

Это не возможно, чтобы получить такую ​​информацию из вашего шаблона. Это по существу спрашивает: что все экземпляры ptr, чей конструктор был вызван?

Что вы можете сделать, это определение глобальной карты std::type_index на int. Поскольку эта карта не ограничивается одним шаблоном, она может отслеживать вызовы бизнес-структур любого экземпляра ptr.

Может быть, стоит отметить, что вы можете получить только определенный реализацией, искаженное, имя типа с помощью std::type_index, так что если вы хотите покрасивее TypeName, то вам нужен способ, чтобы отобразить std::type_index, что вы хотите , Если вы ограничите возможные типы, чтобы выбрать несколько, вы можете сохранить свою собственную карту std::type_index до std::string и использовать ее для печати, или вы можете использовать разборку по конкретной платформе.

EDIT: Сохранение типа - подсчетная карта в родительском классе, отличном от шаблона (аналогично тому, как ответ Элементаля для общего количества), вероятно, будет более уместным, чем его хранение по всему миру.

+0

Как это отличается от моих комментариев? – nwp

+0

@ nwp Главное отличие состоит в том, что вы забыли написать свой ответ в правильной рамке. Кроме того, вы предложили строку в качестве ключа карты. – user2079303

+1

Я не уверен, что это действительно отвечает на вопрос. Я медленно понял вопрос с помощью предложений, и вы просто скопировали мое предложение как ответ, и это меня разозлило. Вы не должны брать кредит на работу других людей. – nwp

1

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

class uniptr { 
    protected: 
    static int number;  
} 

template<class T> 
class ptr: public uniptr 
{ 
private: 
    T* data; 
public: 
    ptr(); 
    ptr(T* data); 
    ~ptr(); 
}; 

Это, кажется, делать то, что вы хотите с некоторым разумным капсулированием. Если это не сразу понятно, это работает, потому что существует только один класс uniptr, объявленный (и, следовательно, только один статический int), хотя могут быть несколько версий ptr, используемых (например, ptr<int> и ptr<String>).