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

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>给函数,那将是更好的解决方案.

Bar*_*rry 5

您的方法存在一些问题.首先,你不能部分专门化功能模板,所以这是从门口出来的.其次,你通过左值引用来获取你的函数 - 这会阻止你传入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)

  • @AbhinavGauniyal它没有传递两个参数.它是一个表达式,它是用逗号分隔的两个单独的表达式.回想一下,逗号抛出第一个表达式并产生第二个表达式的结果. (2认同)