Tôi có một số lượng lớn các lớp được sử dụng để trang trí một vài phương pháp cụ thể.Giảm boilerplate khi trang trí phương pháp
Có cách nào gọn gàng để giảm số lượng mã boilerplate (chủ yếu là tất cả các thông số của hàm tạo và các thành viên để giữ chúng) cần được thêm vào mỗi lớp này? Hoặc, thậm chí tốt hơn, có cách nào tốt hơn để làm điều này không?
Tôi không thể sử dụng các phương pháp ảo và chỉ có thể sử dụng tập con của C++ 11 tính năng được hỗ trợ bởi gcc 4.6 và vs2010.
Tôi tin rằng các nhà xây dựng kế thừa C++ 11 sẽ trợ giúp ở đây, nhưng cả trình biên dịch đều không hỗ trợ chúng và tôi không biết cách giải quyết.
Dưới đây là một ví dụ về những gì các lớp này hiện trông giống như:
template<class Underlying, class T1>
struct A : Base<A<Underlying, T1> >
{
typedef AImpl<decltype(declval<Underlying>().foo()), T1> impl;
A(Underlying u, T1 t1) :
u_(u),
t1_(t1)
{}
impl foo() const { return impl(u_.foo(), t1_); }
impl bar() const { return impl(u_.bar(), t1_); }
const Underlying u_;
T1 t1_;
};
template<class Underlying, class T1, class T2>
struct B : Base<B<Underlying, T1, T2> >
{
typedef BImpl<decltype(declval<Underlying>().bar()), T1, T2> impl;
B(Underlying u, T1 t1, T2 t2) :
u_(u),
t1_(t1),
t2_(t2)
{}
impl foo() const { return impl(u_.bar(), 999, t2_); }
impl bar() const { return impl(u_.foo(), t1_, t2_); }
const Underlying u_;
T1 t1_;
T2 t2;
};
Nhưng không phải trong VC++ 2010 ... – ildjarn
Tôi nghĩ rằng việc sử dụng 'forward' có thể hơi không chính xác (ít hiệu quả nhất) tại đây. Theo mặc định, bất kỳ việc sử dụng 'forward' nào đều phải trong một cuộc gọi phương thức với các kiểu tham số được suy luận. Điều đó có nghĩa là 'mẫu B (Underlying u, V && ... t): u_ (u), t_ (std :: forward (t) ...) {}'. Ba điều: 1) Bản thân hàm phải là một mẫu. 2) Các arg nên được sử dụng như 'U && ...', và 'forward' shuld được sử dụng. Mã hiện tại sẽ * sao chép * các tham số vào 'B' và sau đó nó có thể * di chuyển * chúng vào lớp cơ sở. Lý tưởng nhất, bạn muốn không có bản sao và thay vào đó đã di chuyển tất cả các cách, khi có thể. –
Hai điều, nhận được không phải là một thành viên của tuple trong việc thực hiện tiêu chuẩn (nó là trong Tăng), và việc sử dụng chuyển tiếp là không chính xác trong constructor của bạn. Nên là 'mẫu B (Theo u, V && ... v): u_ (u), t_ (std :: forward (v) ...) {}'. –
DRayX