2016-10-27 82 views
2

所有與模板類交互的代碼都必須使用模板嗎?所有與模板類型交互的代碼都必須使用模板嗎?

想象

template<T> 
class Data { 
public: 
    Data(T value) { 
     this->value = value; 
    }; 
    T getValue() { 
     return value; 
    }; 
    virtual size_t size() = 0; 
private: 
    T value; 
}; 

會有的size()特定實現幾種可能T(字符串,整數,等等)。

注意:我可以有一個抽象類,但我不能既沒有構造函數/ getValue,也沒有虛擬方法,因爲我將不得不指定它們的參數/返回值類型。

進一步假設自己需要的功能,如

template<T> 
size_t getSize(Data<T> value) { 
    return value.size(); 
} 

size()雖然將是每種不同類型的不同,發件人(getSize()方法)不應該關心T

所以問題是爲什麼有必要模板函數,我可以避免它?

+1

如果您只想與單個Data的專業化進行交互,但通常不需要任何Data,則可以避免這種情況。與「Data 」互動不需要模板,但通常會與「Data 」進行交互,因爲Data的每個專門化實際上都是不同的類型。嘗試添加'static_assert(std :: is_same ,數據> :: value,「類型不同。」);'代碼,你會看到它。 –

+0

也許你正在尋找[類型擦除技術](http://stackoverflow.com/documentation/c%2b%2b/2872/type-erasure) –

回答

3

必須全部代碼模板類交互也使用模板?

是的。請注意,你所擁有的是一個class template這是一種表達類的家庭的方式。它不會成爲一個班級。您通過使用像Data<int>這樣的類型創建模板來實現此目的將標出Data的版本,其中T是一個int。

爲什麼是必要的模板功能

的原因是Data<int>Data<double是不一樣的類。就像intdouble不同,當使用不同的模板參數來安裝類模板時,會得到不同的類。如果你想要一個能夠處理類模板可以產生的任何東西的函數,那麼這個函數也需要f unction template,所以它可以爲每個不同的Data生成一個函數。

,我能避免它

有一兩件事你可以做的是從一個基類有Data dervive,然後移動到size基類。然後你可以編寫函數來接受對基類的引用,而不是類模板。

+0

所以基本上像一個接口,對不對?我忘了C++有多重繼承,因此不需要支持接口。 :)謝謝 –

+0

@peter耶,就像一個界面。樂意效勞 – NathanOliver

2

這是你在找什麼?

class Base 
{ 
public: 
    virtual size_t size() = 0; 
}; 

template<typename T> 
class Data : public Base 
{ 
public: 
    Data(T value) { 
     this->value = value; 
    }; 
    T getValue() { 
     return value; 
    }; 
    size_t size() 
    { 
     return this->value.size(); 
    } 
private: 
    T value; 
}; 

size_t getSize(Base& value) 
{ 
    return value.size(); 
} 

void test() 
{ 
    std::vector<int> vi; 
    Data<std::vector<int>> d(vi); 
    getSize(d); 
} 
相關問題