เทมเพลต C ++ เทมเพลต


368

ฉันมีเรียน

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

ฉันต้องการสร้าง a typedefซึ่งสร้างVector(เวกเตอร์คอลัมน์) ซึ่งเทียบเท่ากับ a Matrixขนาด N และ 1 สิ่งที่ต้องการ:

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

ซึ่งก่อให้เกิดข้อผิดพลาดในการรวบรวม ต่อไปนี้สร้างสิ่งที่คล้ายกัน แต่ไม่ใช่สิ่งที่ฉันต้องการ:

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

มีวิธีแก้ปัญหาหรือวิธีแก้ปัญหา / แนวทางปฏิบัติที่ไม่แพงเกินไปหรือไม่?

คำตอบ:


548

C ++ 11 เพิ่มนามแฝงซึ่งเป็นลักษณะทั่วไปของการtypedefอนุญาตแม่แบบ:

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

ชนิดเทียบเท่ากับVector<3>Matrix<3, 1>


ใน C ++ 03 การประมาณที่ใกล้เคียงที่สุดคือ:

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

ที่นี่ชนิดเทียบเท่ากับVector<3>::typeMatrix<3, 1>


45
โอ้เยี่ยมมากฉันไม่เคยเห็นส่วนนี้ของ C ++ 0x และฉันรู้สึกแย่เกี่ยวกับเทมเพลตเท็มเพลตชั่วขณะหนึ่ง ... เดาว่าฉันควรจะอ่านฉบับร่างสุดท้ายให้ละเอียดยิ่งขึ้น
Matthieu M.

2
ผู้รับเหมาก่อสร้างจะทำให้โซลูชันเดิมของ OP เป็นโซลูชันที่ทำงานได้จริงหรือไม่
StackedCrooked

2
@StackedCrooked: ขึ้นอยู่กับเป้าหมายของเขา ฉันหลีกเลี่ยงการสืบทอดเมื่อองค์ประกอบจะทำ (และใช่การสร้างสิ่งที่สืบทอดจะทำให้ทั้งสองอย่างง่ายขึ้น) แต่ฉันยังหลีกเลี่ยงการจัดเรียงเมื่อ typedef จะทำ
GManNickG

1
การใช้ไม่สนับสนุนความเชี่ยวชาญหากฉันไม่ผิดดังนั้นตัวเลือกที่สองยังคงมีประโยชน์ในหลายกรณี
Utkarsh Bhardwaj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.