Để bắt đầu, tôi có một cái gì đó như thế này:C++: Reference/con trỏ đến biến thành viên như mẫu tham số
class Test {
std::vector<int> a, b;
void caller(...) { callee(...); }
void callee(...) { /* Do stuff with 'a' */ }
}
Những gì tôi muốn là phải có một chức năng mà không chính xác giống như callee
nhưng đối với vector b
. Để thực hiện điều này, có hai giải pháp rõ ràng:
- Vượt qua vector
a
hoặcb
làm đối số. Tuy nhiên,callee
là một hàm đệ quy có thể đi cho hàng trăm cuộc gọi và truyền các vectơ làm đối số sẽ chỉ là phí trên không cần thiết. - Sao chép hàm
callee
và sử dụng vectorb
, đây sẽ là giải pháp thay thế tốt nhất, mặc dù thực tế làcallee
là một chức năng khá dài và tôi sẽ có nhiều mã trùng lặp.
Ra khỏi tò mò, tôi đã đi tìm kiếm các phần mẫu và tôi nhận thấy rằng có thể được sử dụng cho
lvalue reference type
pointer type
pointer to member type
Vì vậy, tôi đã cố gắng để làm điều này:
class Test {
std::vector<int> a, b;
void caller(...) { callee<a>(...); }
template <std::vector<int> &x> void callee(...) { /* Do stuff with 'x' */ }
}
nhưng tôi nhận
error: use of ‘this’ in a constant expression
Có cách nào để đạt được điều này hoặc bằng cách tham chiếu ence hoặc một con trỏ?
Bằng cách này, những gì tôi muốn có thể được xem như là một chức năng-scoped #define
"và chuyển vectơ làm đối số sẽ chỉ là phí không cần thiết" Tôi không tin rằng bạn thậm chí sẽ nhận thấy "phí" khi bạn chuyển vectơ bằng tham chiếu hoặc con trỏ. –
Vâng, vâng. Nhưng tôi sẽ lựa chọn không cho giải pháp thứ hai và không có bất kỳ chi phí nào cả. – gmardau
Nếu bạn muốn sử dụng một mẫu như vậy một cách hạn chế, bạn muốn làm 'template' và bất cứ nơi nào bạn sử dụng kiểu, chấp nhận một 'T &' - nếu bạn đặc biệt cần ngăn chặn nó được sử dụng để nói, 'std: : vector 'sau đó sử dụng' std :: enable_if' cho không khớp. –
Olipro