Tôi có một chức năng hiện đang bị quá tải cho các kiểu dữ liệu khác nhau và cần một con trỏ hàm (lambda) để khởi tạo các kiểu dữ liệu đó. Tôi đang trong quá trình chuyển đổi chúng thành các bản mẫu nhưng chưa thành công.Chuyển đổi các chức năng quá tải thành các mẫu chức năng chuyên ngành
Here's the overloaded version -
#include <iostream>
using namespace std;
void doSome(int (*func)(int &)){
int a;
a = 5;
int res = func(a);
cout << a << "\n";
}
void doSome(int (*func)(double &)){
double a;
a = 5.2;
int res = func(a);
cout << a << "\n";
}
int main() {
doSome([](int &a){
a += 2;
return 1;
});
doSome([](double &a){
a += 2.5;
return 1;
});
return 0;
}
Lưu ý rằng tôi đã lấy ví dụ về int
và double
cho đơn giản, họ có thể là một số loại hoàn toàn khác nhau (và phức tạp) trong mã thực tế.
#include <iostream>
using namespace std;
template <typename F, typename S>
void doSome(F &func){
S a;
auto res = func(a);
cout << res << "\n";
}
template<>
void doSome<typename F, int> (F &func){
int a;
a = 5;
auto res = func(a);
cout << res << "\n";
}
template<>
void dpSome<typename F, double> (F &func){
double a;
a = 5.5
auto res = func(a);
cout << res << "\n";
}
int main() {
doSome([](int &a){
a += 2;
return 1;
});
doSome([](double &a){
a += 2.5;
return 1;
});
return 0;
}
Cũng trong khi gọi chức năng templated, nếu tôi không phải vượt qua <any type hints>
đến chức năng, đó sẽ là giải pháp tốt hơn nhiều.
'template <> trống doSome (F & func) 'là sai, và thậm chí nếu bạn đã viết mẫu trống doSome (F & func)', bạn không thể chuyên một phần chức năng' mẫu –
xinaiz
Tôi chỉ tò mò, tại sao bạn muốn chuyển đổi từ quá tải, thành chuyên môn hóa mẫu? Quá tải thường đẹp hơn và ít gây ngạc nhiên hơn các chuyên môn về mẫu chức năng. Quá tải là lý do tại sao bạn không cần chuyên môn hóa một phần cho các mẫu chức năng. Lời khuyên của tôi cho ai đó sẽ là tránh các mẫu chức năng chuyên biệt bất cứ khi nào có thể. Có thể đây là vấn đề XY không? –
@NirFriedman chức năng con trỏ chỉ làm việc cho lambdas không bắt, và đó là rất hạn chế. 'std :: function' sẽ giải quyết vấn đề này và tôi đã sử dụng nó ở mọi nơi khác nhưng các chức năng này là hiệu năng quan trọng và điểm chuẩn đã cho biết con trỏ hàm nhanh hơn rất nhiều trong trường hợp của chúng tôi, vì vậy .. –