是否有可能在沒有專門化的情況下在std容器上使用typedef?標準容器模板typedef(沒有專業化)?
這樣的代碼工作:
typedef std::vector<int> intVector;
但此代碼:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
我得到一個錯誤:
template declaration of 'typedef'
這是可以做到這在C++?
是否有可能在沒有專門化的情況下在std容器上使用typedef?標準容器模板typedef(沒有專業化)?
這樣的代碼工作:
typedef std::vector<int> intVector;
但此代碼:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
我得到一個錯誤:
template declaration of 'typedef'
這是可以做到這在C++?
是的,在C++ 11中。
template <typename T>
using DynamicArray = std::vector<T>;
(不是說你應該使用這個確切的別名)。
常見的解決辦法(如果你不使用C++ 11)是這樣做:
template<class T>
struct DynamicArray
{
typedef std::vector<T> Type;
};
並以此爲DynamicArray<Something>::Type
。
如果你的編譯器支持C++ 11:
template <typename T>
using DynamicArray = std::vector<T>;
否則(C++ 98或以上),你可以使用幫助結構類似以下
template<typename T>
struct DynamicArray
{
typedef std::vector<T> type;
};
,然後用它作爲
DynamicArray<int>::type my_array;
從std :: vector繼承是一種可能的解決方案,但請注意,STL容器沒有虛擬析構函數。即:
template <typename T>
struct DynamicArray: vector<T> { ... };
int main() {
vector<int>* p = new DynamicArray<int>();
delete p; // this is Undefined Behavior
return 0;
}
是的,但是爲什麼我會在內部使用動態內存分配來爲其數據動態分配向量? – dtech 2012-04-27 15:31:33
另外,我不能自己寫一個析構函數,我認爲向量的析構函數應該對其數據負責,我只需要照顧我添加的額外的東西。我可能錯了,我對C++不太瞭解。 – dtech 2012-04-27 15:35:48
我的意思是,可以肯定的是,多態使用可能會出現問題,但由於意圖是僅使用派生類,所以我認爲由於缺少虛擬析構函數而不會有任何問題。我的意思是它不像我要調用指向vector的指針上的delete,它實際上指向一個DynamicArray,它也沒有額外的動態分配成員來需要額外的照顧。如果我錯了,請糾正我。謝謝! – dtech 2012-04-27 15:48:55
該語法在C++中無效,沒有像「template typedef」這樣的功能。
template <typename T>
typedef std::vector<T> DynamicArray<T>;
然而,C++ 11引入了模板的別名語法幾乎是這樣的:
template <typename T>
using DynamicArray = std::vector<T>;
在C++ 03可以使用模板元函數,如:
template<class T>
struct DynamicArray
{
typedef std::vector<T> type;
};
將我自己的解決方案添加到組合中
由於Visual Studio不支持C++ 11功能,我決定只是繼承的std ::載體,以此來增加一些功能:
template <typename T>
class DynamicArray : public std::vector<T> {
public:
DynamicArray& operator<<(const T& value)
{
push_back(value);
return *this;
}
};
現在除了的push_back,鏈接也支持:
DynamicArray<int> array;
array << 1 << 2 << 3 << 4 << 5 << 6;
我不知道這樣的做法可能會造成意想不到的缺點,所以如果你知道一些,請分享!
從標準容器繼承有一些缺點...(conf。我的答案)你是否考慮實現免費函數? 'DynamicArray&operator <<(const DynamicArray&arr,const T&value)' – log0 2012-04-27 15:18:12
考慮到你基本上正在做的是重命名'std :: vector',使用'#define DynamicArray std :: vector'會有多美妙? – suszterpatt 2012-04-27 14:07:09
@suszterpatt - 真,但我儘量保持現代,避免使用不安全的宏:) – dtech 2012-04-27 14:19:14