2010-05-08 27 views
285

Tôi có một lớpC++ template typedef

template<size_t N, size_t M> 
class Matrix { 
    // .... 
}; 

Tôi muốn thực hiện một typedef mà tạo ra một Vector (vector cột) tương đương với một Matrix với kích thước N và 1. Một cái gì đó như thế:

typedef Matrix<N,1> Vector<N>; 

Sản xuất lỗi biên dịch. Sau đây tạo ra một cái gì đó tương tự, nhưng không chính xác những gì tôi muốn:

template <int N> 
class Vector: public Matrix<N,1> 
{ }; 

Có một giải pháp hay giải pháp không đắt tiền/thực hành tốt nhất cho nó?

+15

Chỉ cần chú ý (sau gần ba năm), bạn (vô tình?) Đã sử dụng 'int' thay vì' size_t' trong giải pháp mẫu của bạn. Họ có lẽ nên phù hợp. :) – GManNickG

Trả lời

428

C++ 11 thêm tờ khai bí danh, đó là sự tổng quát của typedef, cho phép mẫu:

template <size_t N> 
using Vector = Matrix<N, 1>; 

Loại Vector<3> tương đương với Matrix<3, 1>.


Trong C++ 03, xấp xỉ gần nhất là:

template <size_t N> 
struct Vector 
{ 
    typedef Matrix<N, 1> type; 
}; 

Ở đây, loại Vector<3>::type tương đương với Matrix<3, 1>.

+32

Rất tuyệt, tôi đã không thấy phần này của C++ 0x và tôi đã bitching về typedated typedef trong một thời gian ... đoán tôi cần phải có một đọc kỹ lưỡng hơn về dự thảo cuối cùng. –

+2

Sẽ kế thừa các nhà thầu làm cho giải pháp ban đầu của OP là giải pháp khả thi hơn? – StackedCrooked

+2

@StackedCrooked: Phụ thuộc vào mục tiêu của anh ấy. Tôi tránh thừa kế khi thành phần sẽ làm (và vâng, thừa kế các nhà xây dựng sẽ làm cho cả hai dễ dàng hơn), nhưng tôi cũng tránh thành phần khi một typedef sẽ làm. – GManNickG