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?

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>.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.