我必须创建一个模板,其返回值是指向某个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;
}
}
答案 0 :(得分:5)
您可以使用std::function
存储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
答案 1 :(得分:3)
你的根本问题是:
template <typename T>
...在这里,T
必须完全在编译时确定,但是:
T laptr(int par)
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;
}
此处,T
在您确定要执行if
语句的哪一段之后才知道,因此类型1)必须在代码完成编译之前知道,更不用说有关执行的事情,但2)在代码执行之前无法确定。
显然你不能同时发生这两种情况,因此代码无法编译。
有很多选择 - 指向函数的指针,std::function
,Command
对象(在 Modern C ++ Design 中定义)等等。他们将基本上做同样的工作:相反,试图返回每个lambda的精确类型,他们将定义一些可以保存lambda类型的常见类型,并返回该类型的对象。