0

我必须创建一个模板,其返回值是指向某个 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;
    }
}
4

2 回答 2

5

您可以使用 astd::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
于 2013-11-12T16:58:16.787 回答
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) 无法确定,直到代码执行。

显然你不能同时发生这两种情况,所以代码无法编译。

有很多替代方案——指向函数的指针、a std::functionCommand对象(如Modern C++ Design中所定义)等。所有这些都将基本上相似地完成工作:而不是尝试返回每个 lambda 的精确类型,他们将定义一些通用类型来保存任一 lambda 的类型,并返回该类型的对象。

于 2013-11-12T17:08:10.847 回答