C ++ template typedef

369

saya ada kelas

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

Saya ingin membuat typedefyang membuat Vector(kolom vektor) yang setara dengan Matrixdengan ukuran N dan 1. Sesuatu seperti itu:

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

Yang menghasilkan kesalahan kompilasi. Berikut ini menciptakan sesuatu yang serupa, tetapi tidak persis apa yang saya inginkan:

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

Apakah ada solusi atau solusi / praktik terbaik yang tidak terlalu mahal untuk itu?

Tidak dalam daftar
sumber

Jawaban:

550

C ++ 11 menambahkan deklarasi alias , yang merupakan generalisasi typedef, yang memungkinkan templat:

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

Jenisnya Vector<3>setara dengan Matrix<3, 1>.


Di C ++ 03, perkiraan terdekat adalah:

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

Di sini, jenisnya Vector<3>::typesetara dengan Matrix<3, 1>.

GManNickG
sumber
45
Oh, bagus, saya belum pernah melihat bagian dari C ++ 0x ini dan saya sudah mengeluh tentang typedef templated untuk sementara waktu ... kira saya harus membaca draft final lebih teliti.
Matthieu M.
2
Akankah mewarisi konstruktor menjadikan solusi asli OP adalah solusi yang lebih layak?
StackedCrooked
2
@StackedCrooked: Tergantung pada tujuannya. Saya menghindari warisan ketika komposisi akan dilakukan (dan ya, mewarisi konstruktor akan membuat keduanya lebih mudah), tetapi saya juga menghindari komposisi ketika typedef akan melakukannya.
GManNickG
1
menggunakan tidak mendukung spesialisasi jika saya tidak salah, sehingga opsi kedua masih berguna dalam banyak kasus.
Utkarsh Bhardwaj