2016-02-15 28 views
7

Trong lớp mẫu, cách xác định bí danh thuộc tính có điều kiện cho mẫu?Tuyên bố tham chiếu có điều kiện trong lớp mẫu

Ví dụ:

template<class Type, unsigned int Dimensions> 
class SpaceVector 
{ 
public: 
    std::array<Type, Dimensions> value; 
    Type &x = value[0]; // only if Dimensions >0 
    Type &y = value[1]; // only if Dimensions >1 
    Type &z = value[2]; // only if Dimensions >2 
}; 

là tuyên bố có điều kiện này có thể? nếu có, làm thế nào?

Trả lời

7

Chuyên hai trường hợp đầu tiên:

template<class Type> 
class SpaceVector<Type, 1> 
{ 
public: 
    std::array<Type, 1> value; // Perhaps no need for the array 
    Type &x = value[0]; 
}; 

template<class Type> 
class SpaceVector<Type, 2> 
{ 
public: 
    std::array<Type, 2> value; 
    Type &x = value[0]; 
    Type &y = value[1]; 
}; 

Nếu bạn có một lớp cơ sở chung sau đó bạn có được một lượng đo đa hình cho các chức năng thông thường.

+0

Cũng có thể muốn một 'static_assert' trong mẫu chính để đảm bảo rằng' Tham số' hợp lệ. – TartanLlama

+0

Tốt, tuy nhiên, tại sao không có chuyên môn lấy được từ nhau? –

+0

@songyuanyao: thay đổi nó, mặc dù cách tôi đã biên dịch nó (có lẽ do lỗi) trong MSVC2013. – Bathsheba

2

Nếu bạn có thể làm mà không có mảng, bạn có thể làm điều này:

template<class Type, std::size_t Dimension> 
class SpaceVector 
{ 
public: 
    Type x; 
}; 

template<class Type> 
class SpaceVector<Type, 2> : public SpaceVector<Type,1> 
{ 
public: 
    Type y; 
}; 

template<class Type> 
class SpaceVector<Type, 3> : public SpaceVector<Type,2> 
{ 
public: 
    Type z; 
}; 

Đây là khả năng mở rộng hơn nếu bạn quyết định để hỗ trợ nhiều hơn ba yếu tố, nhưng nếu không, câu trả lời của Bathsheba có lẽ là phù hợp hơn.

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