我有一个函数,当前为不同的数据类型重载,并采用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'会解决这个问题,我在其他地方使用过,但是这些函数对性能至关重要,基准测试表明函数指针在我们的例子中要快得多,所以.. –