Tôi vừa nhầm lẫn về cách triển khai một cái gì đó theo cách tổng quát trong C++. Đó là một chút phức tạp, vì vậy hãy để tôi giải thích từng bước.Chức năng mẫu làm đối số mẫu
Hãy xem xét mã ví dụ:
void a(int) {
// do something
}
void b(int) {
// something else
}
void function1() {
a(123);
a(456);
}
void function2() {
b(123);
b(456);
}
void test() {
function1();
function2();
}
Đó là một cách dễ dàng đáng chú ý rằng function1
và function2
làm như vậy, với phần duy nhất khác nhau là chức năng nội bộ.
Vì vậy, tôi muốn thực hiện function
chung để tránh tình trạng thừa mã. Tôi có thể làm điều đó bằng cách sử dụng con trỏ hàm hoặc mẫu. Hãy để tôi chọn thứ hai cho bây giờ. Suy nghĩ của tôi là nó tốt hơn vì trình biên dịch chắc chắn sẽ có thể nội tuyến các chức năng - tôi có đúng không? Trình biên dịch có thể vẫn inline các cuộc gọi nếu chúng được thực hiện thông qua con trỏ hàm? Đây là câu hỏi phụ.
OK, trở lại điểm ban đầu ... Một giải pháp với các mẫu:
void a(int) {
// do something
}
void b(int) {
// something else
}
template<void (*param)(int) >
void function() {
param(123);
param(456);
}
void test() {
function<a>();
function<b>();
}
Tất cả OK. Nhưng tôi đang gặp phải vấn đề: Tôi vẫn có thể làm điều đó nếu a
và b
là chính họ?
template<typename T>
void a(T t) {
// do something
}
template<typename T>
void b(T t) {
// something else
}
template<...param...> // ???
void function() {
param<SomeType>(someobj);
param<AnotherType>(someotherobj);
}
void test() {
function<a>();
function<b>();
}
Tôi biết rằng một số mẫu có thể là một trong:
- một loại,
- một kiểu mẫu,
- một giá trị của một loại.
Không ai trong số đó dường như bao gồm trường hợp của tôi. Câu hỏi chính của tôi là: Làm cách nào để giải quyết điều đó, tức là định nghĩa function()
trong ví dụ cuối cùng?
(Có, con trỏ hàm dường như là giải pháp trong trường hợp chính xác này - miễn là chúng cũng có thể được gạch chân - nhưng tôi đang tìm giải pháp chung cho loại sự cố này).
Không chắc chắn lý do tại sao điều này đã được giảm giá. Nó không hoàn toàn thỏa đáng nhưng nó giải quyết vấn đề. –
Vì vậy, để tổng kết: giải pháp duy nhất mà sẽ làm cho nó có thể nội tuyến các cuộc gọi là để thay thế các chức năng với functors? Hơi khó sử dụng, nhưng hoàn toàn có thể chấp nhận được. Cảm ơn! – Kos
Nhưng tôi thừa nhận rằng tôi rất ngạc nhiên sau khi bạn nói rằng không thể thực hiện cuộc gọi bằng địa chỉ ... Nếu địa chỉ có thể được xác định trong thời gian biên dịch bằng với địa chỉ của hàm đã cho, tôi mong đợi trình biên dịch đủ thông minh. :) Strange ... – Kos