我需要你們在CRTP中的幫助(可能是基本問題,對不起)。 這是基於以下職位: C++ object lifetime profiling How to count the number of CRTP subclasses of a template class?C++:CRTP:如何知道所有對象的數量?
使用CRTP,我們能數爲每個類類型創建對象的數量。但是,使用這種方法我找不到在系統中創建的對象的總數。
有什麼辦法可以達到這個目的嗎?
在此先感謝。
問候, SNR
我需要你們在CRTP中的幫助(可能是基本問題,對不起)。 這是基於以下職位: C++ object lifetime profiling How to count the number of CRTP subclasses of a template class?C++:CRTP:如何知道所有對象的數量?
使用CRTP,我們能數爲每個類類型創建對象的數量。但是,使用這種方法我找不到在系統中創建的對象的總數。
有什麼辦法可以達到這個目的嗎?
在此先感謝。
問候, SNR
該解決方案包含(每級和全局)計數器的代碼。
extern size_t Global_counter; //In .cpp file define it: size_t Global_counter = 0;
template <class T>
class CountedClass
{
protected:
static size_t this_class_counter;
public:
static size_t GetThisClassCounter()
{
return this_class_counter;
}
static size_t GetGlobalCounter()
{
return Global_counter;
}
CountedClass()
{
++this_class_counter;
++Global_counter;
}
};
template <class T>
size_t CountedClass<T>::this_class_counter = 0;
使用範例:
class A : public CountedClass<A>
{
public:
A() : CountedClass<A>()
{
}
};
class B : public CountedClass<B>
{
public:
B() : CountedClass<B>()
{
}
};
A a1;
A a2;
B b2;
std::cout<<A::GetThisClassCounter(); //prints 2
std::cout<<A::GetGlobalCounter(); //prints 3
std::cout<<B::GetThisClassCounter(); //prints 1
std::cout<<B::GetGlobalCounter(); //prints 3
+1好的解決方案!如果你將類GetGlobalCounter的getter分解出來(不應該太難),會更好。 –
謝謝。如果想從類中移除GetGlobalCounter(),這可以毫無問題地完成 - 只需將其設置爲全局函數即可。但是,我將它放在那裏,出於某種原因 - 查看示例代碼,它看起來更直觀。您將全局計數器視爲每個類的一部分,而不是一個獨立的變量。但這是一個品味的問題,我認爲:) –
可能是,爲這種情況引入某種類特質類訪問點可能會有用。 –
讓所有類都從一個共同的基類,它保持一個計數器,像
class Counter {
static int count = 0;
protected:
Counter() { count++; }
public:
int getCount() { return count; }
};
繼承至於你要計算所有你並不需要的情況下,區分不同的派生類,所以你不需要CRTP。
如果你想要這兩個計數你可以使用一個類如上面的類作爲你的CRTP類的基類。
在提供的示例中,每個類都已經從'Counted'類繼承,因此您的解決方案引入了多重繼承,這對於這樣簡單的任務來說不是必需的。由於它只是配置文件信息,因此應選擇非侵入式方法。 –
我沒有建議使用多重繼承,讀得更好。像我的例子那樣,將類作爲類模板的基類,並不像使用全局變量那樣更具侵入性和更好的封裝性。如果你不想使用內存分析器侵入,而不是基類。 –
@Nicola Musatti,非常感謝你的代碼。我正在尋找一個類,它可以說派生類對象的創建和銷燬類名(真的想用對象名)。所以qn來自第一個鏈接的對象分析。如果我想爲某個對象保存這些信息,我覺得CRTP很好。 Bcz,與CRTP我可以得到類名,並可以說什麼時候創建,銷燬和該類的大小。 – SNR
請把問題自成體系。 –
你是單程還是多線程程序? –
@Mateusz Grzejek,我想爲單線程做到現在。但未來的需求可能是多線程的。正如你所說,這是爲了維護對象配置文件信息,並希望添加對象大小和任何其他對象相關的信息。 – SNR