gpt4 book ai didi

c++ - 将重载函数转换为专用函数模板

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:35 25 4
gpt4 key购买 nike

我有一个当前针对不同数据类型重载的函数,并采用 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为了简化,它们在实际代码中可能是一些完全不同(且复杂)的类型。


Here's what I've tried yet -

#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>功能,那将是更好的解决方案。

最佳答案

您的方法存在一些问题。首先,您不能部分特化函数模板,所以这是不可能的。其次,您通过左值引用获取您的函数 - 这会阻止您传入 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
}

关于c++ - 将重载函数转换为专用函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42349065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com