Abh*_*yal 2 c++ lambda templates overloading c++14
我有一个当前为不同数据类型重载的函数,并使用lambda(函数指针)初始化这些数据类型.我正在将它们转换为模板实例但尚未成功.
这是重载版本 -
#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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经采用了示例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;
}
Run Code Online (Sandbox Code Playgroud)
同时在调用模板化函数时,如果我不必传递<any type hints>
给函数,那将是更好的解决方案.
您的方法存在一些问题.首先,你不能部分专门化功能模板,所以这是从门口出来的.其次,你通过左值引用来获取你的函数 - 这会阻止你传入lambda,这是一个prvalue.
在这种情况下,很容易在函数模板上添加一些SFINAE,这样只有在可以调用它时才能参与重载解析,int&
而另一个只能用double&
:
template <class F>
auto doSome(F f)
-> decltype(f(std::declval<int&>()), void())
{
// int& case
}
template <class F>
auto doSome(F f)
-> decltype(f(std::declval<double&>()), void())
{
// double& case
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
110 次 |
最近记录: |