我有一個函數,當前爲不同的數據類型重載,並採用lambda(函數指針)來初始化這些數據類型。我正在將它們轉換爲模板實例,但尚未成功。將重載函數轉換爲專門的函數模板
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;
}
請注意,我爲簡化拍攝的int
和double
例如,他們可能是一些完全不同的(和複雜)類型的實際代碼。
#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;
}
而且在調用模板的功能,如果我沒有通過<any type hints>
的功能,這將是更好的解決方案。
'模板<> 無效doSome <類型名樓int>的(F&FUNC)'是錯誤的,即使你寫'模板 無效doSome (F&FUNC)',你不能部分專門功能模板 –
xinaiz
我只是好奇,爲什麼你想從重載轉換爲模板專業化?重載通常比函數模板專業化更好,並不令人驚訝。重載是你不需要對函數模板進行部分特化的原因。我對某人的建議是儘可能避免專用功能模板。這可能是一個XY問題嗎? –
@NirFriedman函數指針只適用於非捕獲lambda表達式,這是非常有限的。 'std :: function'會解決這個問題,我在其他地方使用過,但是這些函數對性能至關重要,基準測試表明函數指針在我們的例子中要快得多,所以.. –