2009-07-26 35 views
7

在一些C++代碼中,我使用整數來存儲大量不斷變化的數據。 爲了分析我的程序,我想記錄某些變量的某些變化,例如某個值被賦值的頻率以及賦值多長時間一次(新值與舊值相同)。C++派生自本機類型

如果類型是一個Foo類,我只是派生一個新的LoggingFoo並將我的日誌數據添加到我感興趣的成員函數中,然後調用父成員函數。 我不得不更新我的代碼以使用新類型,但只要我最初與typedefs一致,那是一個單行更改。

我的問題是,我想添加日誌記錄的變量是一個int。你不能從C + +內置類型派生(你能嗎?)

我的問題是是否有一種聰明的方式來從基本類型(int,float,double等)派生。

的解決方案可能是定義一個新的類,它有效是一個int ..它定義操作一個int能做的,只是應用於的操作私人int數據成員。 這個策略可以工作,但也許其他人已經做了這樣一個類,我只能使用「fakeint.h」頭文件定義。在我自己實現它們之前,是否有這樣的「代理本地類包裝器」類型定義已經可用?

我當然意識到我的代理int不能與int互換使用,特別是因爲現有的函數定義都期望int ..但是對於我的應用程序來說,這全部在一個內部循環中,它正在做很多簡單的native + - *^=操作,不用作函數參數或任何東西。

+1

你應該看看boost的操作符:http://www.boost.org/doc/libs/1_39_0/libs/utility/operators.htm。 它可以讓你創建一個具有所有典型運算符的類,使它像一個本地整數類型一樣工作。 – 2009-07-26 02:18:08

+0

@Evan ..謝謝,這是一個很好的資源!過度需要我需要的東西,但如果我確實需要推出自己的產品,則會顯着減少冗餘工作。 – SPWorley 2009-07-26 02:21:22

回答

6

事情是這樣的......

template <typename T> class logging_type 
{ 
private: 
    T value; 
public: 
    logging_type() { } 
    logging_type (T v) : value(v) { } // allow myClass = T 
    operator T() { return value; } // allow T = myClass 
    // Add any operators you need here. 
}; 

這將創建一個模板類,可以在兩個方向上轉換爲原始類型。您需要在代碼中爲該類型中使用的每個操作添加日誌記錄處理和重載操作符。因爲它可以隱式轉換爲int(或者你指定的任何類型),所以你的代碼可能會默默地將你的日誌int轉換爲一個int,並且你會留下不完整的日誌。您可以通過向構造函數中添加一個「顯式」關鍵字來防止這種情況,但是您無法執行與轉換運算符類似的任何操作。除非你可能讓它變成私人的......我還沒有嘗試過。儘管做這些事情中的任何一個都會有點失敗。

編輯:由於C++ 11,你可以添加explicit轉換操作。

+2

這感覺非常非常有希望..它具有吸引力,默認情況下一切正常,我需要包裝的唯一funcs是我想要處理自定義日誌記錄的。 它**幾乎**作品! I = I + 1;沒問題。 cout << i;沒問題。但是例如i + = 1;或i ++;纔不是。 不過,這對於填補大部分操作員來說可能很好,我可以手動處理餘下的操作。 – SPWorley 2009-07-26 03:02:42

-1

你永遠無法從原始類型

得出基本 Idioms另一個鏈接
+2

確實如此,但還有其他的事情可以做,這可能就是爲什麼你從其他人那裏得到了投票。 – 2009-07-26 03:42:01

3

這實際上是一種情況,其中#define是非常有幫助的。 我建議

#ifdef DEBUG 
# define INTGR MyDebugIntegerClass 
#else 
# define INTGR int 
#endif 

確保MyDebugIntegerClass可以施展自己到正規的INT,並擁有所有合適的運營商。然後,用INTGR編寫你的代碼。

在調試模式下,您將獲得所有類的日誌記錄,但在發佈模式下,您將得到一個純粹基本的int。