2008-10-30 39 views
7

Có thể typedef loại dài sử dụng mẫu không? Ví dụ:typedefs cho các lớp templated?

template <typename myfloat_t> 
class LongClassName 
{ 
    // ... 
}; 

template <typename myfloat_t> 
typedef std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > LongCollection; 

LongCollection<float> m_foo; 

Điều này không có tác dụng, nhưng có cách nào để đạt được hiệu quả tương tự không? Tôi chỉ muốn tránh phải gõ và đọc một định nghĩa kiểu bao gồm gần như toàn bộ chiều rộng của cửa sổ trình soạn thảo của tôi.

Trả lời

14

Không, hiện tại không thể. Nó sẽ được thực hiện trong C++ 0X AFAIK.

Điều tốt nhất tôi có thể nghĩ đến là

template<typename T> struct LongCollection { 
    typedef std::vector< boost::shared_ptr< LongClassName<T> > > type; 
}; 

LongCollection<float>::type m_foo; 
+0

Điều đó hoạt động ... nhưng bạn sẽ phải sao chép tất cả các ctors của bạn. –

+0

sao chép tất cả các ctors của bạn? – dalle

+0

Thật vậy, sao chép tất cả các ctors của bạn ?? – mch

3

Nếu bạn không muốn đi theo con đường vĩ mô, bạn phải chắc typedefs cá nhân đối với từng loại:

typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection; 
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection; 
+0

Đây là, sau khi tất cả, làm thế nào std :: string là một typedef của std :: basic_string. –

2

Không, nhưng bạn có thể đến gần bằng cách sử dụng loại 'trợ giúp', xem số example này.

1

của nó không chính xác những gì bạn đang yêu cầu, nhưng điều này có thể đạt được hiệu quả mong muốn phụ thuộc vào tình hình thực tế của bạn:

template <typename myfloat_t> 
class LongClassName 
{ 
    // ... 
}; 

template <typename myfloat_t> 
class LongCollection : public std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > 
{ 
}; 

Bạn có thể cần thêm một số nhà thầu hoặc nhà khai thác tùy thuộc vào nhu cầu của bạn.

+0

Không bắt nguồn từ bộ sưu tập STL được coi là xấu? Họ không có chức năng ảo. Tôi nghĩ rằng nó sẽ được an toàn hơn để thực hiện LongCollection trong điều khoản của một std :: vector bằng cách sử dụng như là một biến thành viên. Thừa kế riêng cũng có thể là một tùy chọn. – mch

+0

Nó không được coi là thực hành tốt nhưng nó không thực sự đặt ra những vấn đề bạn đề cập miễn là bạn không có ý định sử dụng đa hình. –

2

Giải pháp được hiển thị bởi Leon là kinh điển. Bit của kiến ​​thức nền: Đây được gọi là một "khuôn mẫu" metafunction "bởi vì nó về cơ bản là một" chức năng "được đánh giá tại thời gian biên dịch. Thay vì các giá trị, nó đề cập đến các kiểu: Có một danh sách các kiểu đầu vào (các đối số kiểu) và có một “giá trị trả về”: typedef khai báo tên kiểu “type”.

“Invocation” hoạt động Tương tự chức năng gọi bình thường, mặc dù với một cú pháp khác nhau:

// Normal function 
result = f(args); 

// Metafunction 
typedef f<args>::type result; 

đang xây dựng Đây là một thành ngữ thường được sử dụng trong các thư viện như các thư viện Boost và ngay cả trong STL tại một nơi: allocator_type::rebind<U>::other hoàn thành cùng một điều với sự khác biệt duy nhất mà typedef type được gọi là other.

+0

Tôi nghĩ bạn có nghĩa là 'metlate metafunction'. :) –

+0

Yea, cộng với “p”. ;-) Cảm ơn. –

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