5

Có thể sử dụng typedef trên một thùng chứa std mà không chuyên nó?Template typedef cho container std (không có chuyên môn)?

Mã như thế này hoạt động:

typedef std::vector<int> intVector; 

Nhưng đối với mã này:

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

tôi nhận được một lỗi:

template declaration of 'typedef'

Có thể làm điều này trong C++ ??

+0

Xem xét rằng tất cả những gì bạn đang làm là đổi tên 'std :: vector', làm thế nào để sử dụng' #define DynamicArray std :: vector'? – suszterpatt

+0

@suszterpatt - đúng, nhưng tôi cố gắng giữ cho nó hiện đại và tránh sử dụng các macro không an toàn :) – dtech

Trả lời

9

Có, trong C++ 11.

template <typename T> 
using DynamicArray = std::vector<T>; 

(Không phải là bạn nên sử dụng bí danh này chính xác.)

+0

Dường như nó không hoạt động trong Visual Studio 2010 SP1. Tôi nhận được "tuyên bố/định nghĩa mẫu không thể nhận ra" Tôi cho rằng nó chưa được MS hỗ trợ? – dtech

+1

@ddriver: Không, không phải vậy. Và không phải bởi VC11, AFAIR. Nếu bạn muốn C++ 11, hãy sử dụng GCC hoặc Clang. –

+0

Tôi tìm thấy một giải pháp cho VS bằng cách đơn giản thừa hưởng vectơ. Xin vui lòng xem câu trả lời tôi thêm vào và làm sáng tỏ một số nếu đây không phải là một ý tưởng tốt. Cảm ơn! – dtech

2

Các giải pháp chung (nếu bạn không sử dụng C++ 11) là để làm điều này:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> Type; 
}; 

Và sử dụng nó như DynamicArray<Something>::Type.

6

Nếu hỗ trợ biên dịch của bạn C++ 11:

template <typename T> 
using DynamicArray = std::vector<T>; 

khác (C++ 98 tuổi trở lên), bạn có thể sử dụng một cấu trúc giúp đỡ như sau

template<typename T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 

và sau đó sử dụng nó như

DynamicArray<int>::type my_array; 

Thừa kế từ tiêu chuẩn :: vector là giải pháp khả thi nhưng lưu ý rằng các vùng chứa STL không có trình phá hủy ảo. tức là:

template <typename T> 
struct DynamicArray: vector<T> { ... }; 

int main() { 
    vector<int>* p = new DynamicArray<int>(); 
    delete p; // this is Undefined Behavior 
    return 0; 
} 
+0

Có, nhưng tại sao tôi sẽ tự động phân bổ một vector khi nó đang sử dụng phân bổ bộ nhớ động cho dữ liệu của nó trong nội bộ? – dtech

+0

Ngoài ra, tôi không thể chỉ viết một destructor bản thân mình, tôi nghĩ rằng destructor của vector phải chịu trách nhiệm về dữ liệu của nó, tôi chỉ cần chăm sóc thêm những thứ tôi thêm vào. Tôi có thể sai, tôi không quá tốt với C++. – dtech

+0

Tôi có nghĩa là, chắc chắn, có thể có vấn đề với việc sử dụng đa hình, nhưng vì mục đích là chỉ sử dụng lớp dẫn xuất tôi không nghĩ sẽ có bất kỳ vấn đề nào do thiếu trình phá hủy ảo. Tôi có nghĩa là nó không giống như tôi sẽ gọi xóa trên một con trỏ đến vector mà thực sự trỏ đến một DynamicArray, mà cũng không có thêm thành viên được phân bổ động để yêu cầu chăm sóc thêm. Hãy sửa tôi nếu tôi sai. Cảm ơn! – dtech

3

Cú pháp này không hợp lệ trong C++, không có tính năng như "mẫu typedef".

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

Tuy nhiên, C++ 11 giới thiệu một cú pháp mẫu bí danh đó là hầu như thế này:

template <typename T> 
using DynamicArray = std::vector<T>; 

Trong C++ 03 bạn có thể sử dụng một mẫu metafunction như:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 
0

Để thêm giải pháp của riêng tôi vào kết hợp

Vì tính năng C++ 11 không được hỗ trợ bởi Visual Studio, tôi quyết định chỉ kế thừa std :: vector, sử dụng này để thêm một số chức năng:

template <typename T> 
class DynamicArray : public std::vector<T> { 
public: 
    DynamicArray& operator<<(const T& value) 
    { 
     push_back(value); 
     return *this; 
    } 
}; 

Bây giờ bên cạnh push_back, chaining cũng được hỗ trợ:

DynamicArray<int> array; 
array << 1 << 2 << 3 << 4 << 5 << 6; 

Tôi không biết nếu một cách tiếp cận như vậy có thể có một số nhược điểm ngoài ý muốn , vì vậy nếu bạn biết một số, hãy chia sẻ chúng!

+1

Thừa kế từ các thùng chứa tiêu chuẩn có một số hạn chế ... (conf. My answer) Bạn có cân nhắc thực hiện các chức năng miễn phí thay thế không? 'DynamicArray & operator << (const DynamicArray & arr, const T & giá trị)' – log0

Các vấn đề liên quan