2012-07-08 32 views
0

我目前在我的代碼中有這個。C++預處理器+檢測對象類型和新操作

template<typename T1> class MONEYTRANSFER { 
    SOURCEACCOUNT<T1, MONEYTRANSFER> *SourceAccount;    // Line 2 
    MONEYTRANSFER(T1 *src) { 
    SourceAccount = new (src) SOURCEACCOUNT<T1, MONEYTRANSFER>; // Line 4 
    } 
}; 

雖然我知道這是不是亂了,我想至少嘗試,使這個看起來更好一點。

是否可以更改第2行,以便'MONEYTRANSFER'通過了解它在哪個類中自動檢測到?

是否可以使用第4行的預處理器。因此,我可以鍵入bind(src, SourceAccount); - 無需爲新操作輸入SourceAccount (SOURCEACCOUNT<T1, MONEYTRANSFER>)的類型。我試過decltype但沒有運氣?任何幫助將不勝感激!

+2

你如何試圖'decltype'和什麼地方出了錯? – aschepler 2012-07-08 20:30:40

+2

即使在編寫C++代碼時,財務人員也會使用COBOL風格...... – leftaroundabout 2012-07-08 21:16:37

+0

@aschepler:您將在第2行中使用哪種表達式與decltype? '*這個'在會員外無效。 – MSalters 2012-07-08 21:34:24

回答

1

我有一個基類的mixin解決這個問題:

template<typename T1, typename T2> class WithSourceAccount 
{ 
    protected: 
    SourceAccount<T1, T2>* m_SourceAccount; 
    WithSourceAccount(T1* src) 
     : m_SourceAccount(new (src) SourceAccount<T1, T2>()) 
     { } 
}; 

template<typename T1> 
class MoneyTransfer : WithSourceAccount<T1, MoneyTransfer> 
{ 
}; 
+0

不錯的嘗試;),但代碼是正確的,並使用新的位置。 new(src)SOURCEACCOUNT (); 將是'完整'版本。我懷疑只有preproc會起作用。 – 2012-07-08 22:03:54

+0

@MichaelBrown:好的,使它成爲新的展示位置。請注意,在實例化時出現'T2 == MoneyTransfer'。我不確定「完整」版本的含義。 – MSalters 2012-07-09 12:57:00