Điều gì đó giống như những gì bạn muốn đạt được có thể được thực hiện với kế thừa. Tức là, lớp cha có tên biến mà bạn muốn mẫu của bạn có.
struct ItemNull {};
template <typename X, typename Y = ItemNull>
class Item : public X, public Y {};
template <typename T> struct HasPosition { T Position; };
template <typename T> struct HasMomentum { T Momentum; };
Item< HasPosition<float> > myItem1;
myItem1.Position = 0.123f;
Item< HasPosition<float>, HasMomentum<float> > myItem2;
myItem2.Position = 0.1f;
myItem2.Momentum = 0.2f;
Đối số thứ hai tùy chọn cho phép bố cục, như minh họa trong myItem2
. Để thêm một lĩnh vực thứ ba, bạn có thể thêm vào phần đuôi, hoặc mở rộng từ phía trước:
template <typename T> struct HasName { T Name; };
Item <
HasPosition<float>,
Item< HasMomentum<float>, HasName<std::string> >
> myItem3;
myItem3.Position = 0.1f;
myItem3.Momentum = 0.2f;
myItem3.Name = "Adam";
Item <
Item < HasPosition<float>, HasMomentum<float> >,
HasName<std::string>
> myItem4;
myItem4.Position = 0.1f;
myItem4.Momentum = 0.2f;
myItem4.Name = "Adam";
sở thích cá nhân của tôi là dành cho cựu trong hai phương pháp, bởi vì tôi thấy nó là một cách trực quan hơn để mở rộng nó vượt quá 3 lĩnh vực. Cú pháp mẫu Item
có thể được đơn giản hóa bằng cách sử dụng các đối số mẫu variadic.
Mẫu Has...
có thể được tạo bằng máy hoặc macro có thể được tạo để thêm trường mới một nhiệm vụ tương đối đơn giản.
#define MAKE_HAS(X) template <typename T> struct Has##X { T X; }
MAKE_HAS(Position);
MAKE_HAS(Momentum);
MAKE_HAS(Name);
1. Không thể thực hiện được. 2. Có lẽ là một ý tưởng rất bị hỏng. 3. Tại sao bạn nghĩ rằng bạn cần điều này? (4. Bộ tiền xử lý có thể thực hiện điều này, nhưng đó không phải là câu trả lời có thể chấp nhận được) – delnan
Hãy để tôi đoán: bởi vì anh ấy là lập trình viên PHP cũ ;-) –
Vâng, tôi biết nó tối nghĩa! Tôi đang thực hiện một kiểu đỉnh kiểu khuôn mẫu chung, trong đó mỗi thành phần của một đỉnh có cả một loại (tức là float [3] hoặc Vector3d - và cách sử dụng, nghĩa là usage_normal, usage_position, v.v. Tôi muốn có thể tạo đỉnh bằng cách chuyển các đối số mẫu và sử dụng đệ quy mẫu để xây dựng một cấu trúc, theo cách tương tự như sau: http://www.entropygames.net/index.php?option=com_content&view=article&id=51:generic-vertices&catid=37:articles&Itemid = 56 – Robinson