2012-02-22 81 views
3

請參考下面的代碼
Specialized function in non specialized Template class
是否可以編寫一個專門的函數foo,對於非專業的模板類MyClass的[行號7]?如果是,那麼,相同的語法是什麼。
問候,
阿圖爾專業功能

+1

不要使用宏寫'template'線。這很難理解。而且,你的問題是什麼?鏈接中顯示的代碼是否不相同? – iammilind 2012-02-22 03:45:16

+0

不清楚問題。什麼是foo專業化? – 2012-02-22 03:46:10

+0

@ iammilind ::我想問的問題是,假設我想以不同的方式實現MyClass 的函數foo,並且我不想使用專門的Template類(正如我在代碼中所做的那樣) ,那有可能嗎?如果是的話,那麼如何實現呢? – Atul 2012-02-22 03:47:59

回答

2

這可以,如果你創建類模板的完全專門來完成。只是參考答案這樣一個問題:If I want to specialise just one method in a template, how do I do it?

否則,如果你想擁有具有相同簽名給定函數具有取決於類的實例化版本兩種不同的行爲,並實例化的偏特模板類,你將不得不做一個模板類的專門化。

請記住,如果您希望在第二種情況下避免冗餘代碼,您可以始終創建一個基本模板類,該類將具有不會更改的功能,然後創建將包含唯一功能的派生模板類每個部分專業化都需要。

+0

Jason,但是,這似乎不適用於具有多個typenames的模板類。請參考下面的代碼http://ideone.com/fpikG – Atul 2012-02-23 04:13:11

+0

在你的例子中不起作用的稱爲類模板的*部分特化*,並且是我在我的答案中提到的條件工作......你必須爲部分專門化的課程創建一個完整的定義。如果您想知道使用什麼語法,只需Google或搜索S.O.對於「部分模板專業化」...你會發現大量的信息。 – Jason 2012-02-23 04:25:00

2

看我下面的例子,我本人在可能的最簡單的代碼,試圖回答你的問題(如果我猜得不錯):

#include <iostream> 

using namespace std; 

template<typename T> 
class Some 
{ 
public: 
    template<typename U> void foo(U val); 
}; 

template<typename T> 
template<typename U> 
void Some<T>::foo(U val) 
{ 
    cout << "Non specialized" << endl; 
} 

template<> 
template<> 
void Some<char>::foo(char val) 
{ 
    cout << "Char specialized" << endl; 
} 

int main() 
{ 
    Some<int> t1; 
    t1.foo(5); 

    Some<char> t2; 
    t2.foo('c'); 

    return 0; 
} 
  1. 重要的事情這裏要注意的是「你不能專門化你的班級和獨立工作」,也就是說,你必須同時在這個例子中做到這一點。

  2. 此外,在這種情況下,您失去了專門爲您的班級提供數據類型「char」的機會。 (需要在此確認)。

UPDATE ::證實,對2點

1

如果你想專注MyClass的<布爾> ::富,它應該是這樣的:

template <> 
void MyClass<bool>::Foo(bool A) 
{ 
    // code goes here 
} 
1

如果你問的是,

(1)你想有一個功能Foo()這沒有按「T採取任何參數和返回 內部voidMyClass

(2)本Foo()應該是排他性的MyClass當 模板類型是bool,即只針對MyClass<bool>

那麼這裏是這樣的:

template<class Precision> 
class MyClass { 
    ... 
public: 
    ... 
    void Foo(); // don't implement here 
}; 
... 
template<> 
void MyClass<bool>::Foo() // implementing only for 'MyClass<bool>' 
{  // invoking for other 'MyClass<>' will result in compiler error 
    ... 
}