2011-09-29 47 views
0

有沒有什麼辦法可以創建類模板函數?如何製作通用類方法?

因此,例如

//Warning: this is conceptual pseudo-code 

template<typename TemplateClass, TemplateItem> 
TemplateClass &TemplateClass::operator=(TemplateItem &B) 
{ 
    Item = B.Item; 
    return *this; 
} 

//or... 

template<typename TemplateClass, TemplateItem> 
TemplateClass &TemplateClass::Assignment(TemplateItem &B) 
{ 
    Item = B.Item; 
    return *this; 
} 

Assignment<TestA,TestB>(B); 

或者類似的規定。

它不只是任務,我會發表評論。

+5

也許這只是我,但我不知道你在問什麼。應該做什麼功能? – jalf

+0

它基本上是一個方法模板,可以爲任何類工作,並採取任何模板項目。 IE我可以將相似的賦值操作模板化爲一次調用,而不是爲具有不同類返回的子類重複多行代碼。 – SSight3

+1

在這種情況下,只是使其成爲非會員功能? – jalf

回答

1

我想我肯定會被「預處理器是邪惡的」組得到撞壞,但我認爲你正在尋找的東西是這樣的:

#define DEFINE_ASSIGNMENT(mainClass,memberClass,member)  \ 
mainClass & mainClass::operator = (const memberClass & rhs) \ 
{                \ 
    member=rhs.member;           \ 
    return *this;            \ 
} 

DEFINIE_ASSIGNMENT(TestA,TestB,Item) 
+0

這是一個很好的主意。我非常喜歡它,是的,這是我追求的東西。 Upvote的獨創性。我希望模板方法可以發生繼承,但如果沒有人(如果沒有人可以提供可行的方法),我會選擇它。我得到了太多的重複代碼(但由於返回問題,我不能使用默認或繼承)。 – SSight3

+0

你能告訴我'\'是什麼嗎?謝謝。 – SSight3

+1

@ SSight3使用''''結尾一行是連續字符。通常'#define'指令停在行尾,''''告訴預處理器繼續前進。它們也可以用來擴展單行'//'註釋,但是一些編譯器會警告如何使用它們。 ''''''必須在行尾,它後面不能有空格。 – IronMensan

1

不能添加東西放到一個類的定義。你不能強迫一個類具有特定的成員函數。一旦你把;放在類定義上,它就已經被定義了,並且它不能被修改。因此,如果您想擁有班級成員,則必須在內聲明班級定義。

現在,延長這樣的功能,一般的方法是使用一個非成員函數:

template<typename ClassName, typename Other> 
ClassName &SomeFunc(ClassName &myType, const Other &theOther); 

該函數將返回myType

顯然,這不會幫助有是一個類的成員,像賦值運算符。但是對此你無能爲力。你可以做的最多的是賦值運算符調用非成員函數,因此所有的實際工作都在那裏進行。

但是,這是你能做的最好的。