2012-05-03 39 views
6

Tôi gặp sự cố tôi gặp phải gần đây. Tôi thực sự nghĩ rằng nó không thể được giải quyết như tôi muốn nó được, nhưng nó sẽ khá tiện dụng nếu nó có thể. Dù sao, đây là vấn đề:Bí danh chuyên môn về mẫu

Tôi sẽ cung cấp cho bạn một ví dụ tôi đã xem một vài ngày trước trên diễn đàn này vì nó sẽ dễ dàng hơn để giải thích với nó. Hãy nói rằng tôi đang cố gắng để tạo ra một cấu trúc tensor, theo cách này:

template <int N> 
struct Tensor 
{ 
    Tensor<N - 1> x; 
    Tensor<N - 1> y; 
    Tensor<N - 1> z; 
}; 

Để tránh đệ quy vô hạn, tôi sẽ phải viết mẫu chuyên môn cho N = 1.

template<> 
struct Tensor<1> 
{ 
    double x; 
    double y; 
    double z; 
}; 

Trên thực tế, khi N = 1, Tensor này thực sự là một Vector (vật lý một). Giả sử tôi đã có cấu trúc Vector được xác định theo cách này:

struct Vector 
{ 
    double x; 
    double y; 
    double z; 
}; 

Cấu trúc này giống hệt như Tensor < 1>. Kể từ khi Vector struct đã tồn tại và, giả sử tôi đã không thực hiện nó bản thân mình, tôi muốn để có thể làm cho Tensor < 1> struct một bí danh của Vector struct. Cũng giống như một typedef. Vì vậy, tôi muốn làm điều đó theo cách này:

// C++03 
typedef Vector Tensor<1>; 

// or C++11 
using Tensor<1> = Vector; 

Bằng cách này, tensor < 1> và Vector sẽ là như nhau struct chính xác, vì vậy nó sẽ tôi có thể sử dụng một trong thay vì khác trong chương trình bất cứ nơi nào tôi muốn và tôi sẽ không phải viết cùng một cấu trúc hai lần.

Tuy nhiên, thực sự không thể xác định chuyên môn mẫu theo cách đó. Nếu có, tôi sẽ không hỏi câu hỏi ở đó.

Lưu ý: Tôi biết các ví dụ trước không phải là một trong những tốt vì chúng ta vẫn có thể làm điều này:

using Vector = Tensor<1>; 

Nhưng nó là khá khó chịu nếu tôi muốn làm điều đó với chuyên ngành của hai cấu trúc khác nhau. Ví dụ khi viết một thư viện hình học có thể tính toán hình học trong không gian N-chiều:

using Circle<2> = Hypersphere<2>; 

Vì vậy, để tổng hợp: là có một cách để tạo mẫu chuyên ngành bằng cách định nghĩa nó như là bí danh của nhau?

Trả lời

8

lớp di sản Do vô hướng, Vector và ma trận, bạn có thể sử dụng thừa kế:

template<> 
class Tensor<0>: public Scalar {}; 

template<> 
class Tensor<1>: public Vector {}; 

template<> 
class Tensor<2>: public Matrix {}; 

Lưu ý rằng đây không phải là lạm dụng quyền thừa kế bởi vì bạn là người mẫu một là-một mối quan hệ.

+0

Vâng, tôi đã nghĩ về điều đó, nhưng nếu tôi làm như vậy, các lớp học sẽ không phải là "chính xác như nhau". Tôi có nghĩa là tôi sẽ phải cast và down_cast để truyền các biến từ kiểu này sang kiểu khác:/ Tôi biết nó chỉ là một chi tiết và có lẽ nó không được coi là kiểu an toàn để nghĩ những lớp đó theo cách tôi làm, nhưng nó chính xác Tôi muốn vượt qua. Cảm ơn anyway :) – Morwenn

+0

@Morwenn Để biết thêm tính tổng quát, ví dụ của bạn sẽ cần hai tham số mẫu: 'mẫu lớp Tensor . Ở đây, D sẽ là số không gian kích thước. – TemplateRex

+0

Có, nhưng tôi chỉ trình bày ví dụ này để phơi bày một vấn đề cú pháp. Tôi không dùng Tensors hay bất cứ thứ gì.Nó chỉ là để xóa tâm trí của tôi về khả năng C++^^ " – Morwenn

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