C++ 如何在模板中返回lambda指针?

C++ 如何在模板中返回lambda指针?,c++,templates,pointers,c++11,lambda,C++,Templates,Pointers,C++11,Lambda,我必须创建一个模板,其返回值是指向某个lambda函数的指针,该函数由模板参数决定 编译器反馈: error: no matching function for call to ‘laptr(int)’ 代码怎么了?如何解决这个问题 #include <iostream> using namespace std; template <typename T> T laptr(int par); int main(){ laptr(1); return

我必须创建一个模板,其返回值是指向某个lambda函数的指针,该函数由模板参数决定

编译器反馈:

error: no matching function for call to ‘laptr(int)’
代码怎么了?如何解决这个问题

#include <iostream>

using namespace std;

template <typename T>
T laptr(int par);

int main(){
    laptr(1);
    return 0;
}

///////////

template <typename T>
T laptr(int par)
{
    if (par == 1)
    {
        int p1 = [](int a, int b)->int{return a*b; };
        return p1;
    }
    else
    {
        double p2 = [](double a, double b)->double{return a + b; };
        return p2;
    }
}
可以使用std::函数存储lambda函数:

template <typename T>
std::function<T(T,T)> laptr (int par)
{
    if(par == 1)
        return [](T a, T b)->T {return a*b;};
    else
        return [](T a, T b)->T {return a+b;};
}
甚至是指向函数的指针

template <typename T>
auto laptr (int par) -> T(*)(T,T)
{
    ...
}
你可以这样使用它

auto func = laptr<double>(1);

auto result = func(8,2); // 8*2=16

你的根本问题是:

template <typename T>
在运行时之前不知道par,并且:

if (par == 1)
{
    int p1 = [](int a, int b)->int{return a*b; };
    return p1;
}
else
{
    double p2 = [](double a, double b)->double{return a + b; };
    return p2;
}
在这里,在决定执行if语句的哪一段之前,T是未知的,因此在代码完成编译之前,必须知道类型1,更不用说执行了,但是在代码执行之前,2是未知的

显然,这两种情况不能同时发生,因此代码无法编译


有很多替代方案——一个函数指针,一个STD::Fuffic函数,一个在现代C++设计中定义的命令对象。所有这些都将基本上类似地完成这项工作:而不是试图返回每个lambda的精确类型,而是要定义一些可以保存lambda类型的普通类型,如果lambda不需要捕获任何内容,则返回该类型的对象。

或者甚至是普通的旧函数指针。编译器在调用laptr方法时无法推断返回类型。函数模板的模板参数仅从其常规实际参数推导,而不是从其主体推导。由于不能从不包含T的参数中推导出T,因此此模板只能被称为laptrvalue,这显然是无用的。此外,看起来您正试图根据参数的值返回不同类型的lambda。您的语法不正确,但这并不重要。这根本无法做到。模板并不能神奇地使之成为可能。
if (par == 1)
{
    int p1 = [](int a, int b)->int{return a*b; };
    return p1;
}
else
{
    double p2 = [](double a, double b)->double{return a + b; };
    return p2;
}