在 class 构造函数中使用时,Lambda 无法隐式转换

Lambdas dont implicity convert when using in class constructors

我正在尝试简单地实现 std::function

以下代码适用于显式转换的函数指针和 lambda。

template<typename funct>
class functor {
private:
    funct *function;
public:
    functor() = default;
    functor(funct *func) : function(func) {};

    template<typename T>
    T operator()(T a, T b){
        return function(a, b);
    }
};

int add(int a, int b) {
    return a + b;
}
int main(int argc, char **argv) {
    std::map<std::string, functor<int(int,int)>> maps = { {"+", add} };
    maps.insert({ "%", {[](int i, int j)->int { return i * j; } } } );
    auto temp = maps["%"](5,6);
    std::cout << temp << std::endl;
    system("PAUSE");
    return 0;
 }

我想知道为什么 lambda 不适用于隐式转换。

maps.insert({ "%", [](int i, int j)->int { return i * j; } }  );

以上代码无效,但以下代码有效:

maps.insert({ "%", {[](int i, int j)->int { return i * j; } } } );

但是 std::function 适用于 {} 和不适用。

正如@KerrekSB 在评论中提到的,只需给您的 functor 一个像这样的模板化构造函数:

template<class F>
functor(F f) : function(f) {}

现在您可以在初始化地图时省略大括号:

#include <map>
#include <iostream>

template<typename funct>
class functor {
private:
    funct *function;
public:
    functor() = default;

    template<class F>
    functor(F f) : function(f) {}

    template<typename T>
    T operator()(T a, T b){
        return function(a, b);
    }
};

int add(int a, int b) {
    return a + b;
}

int main(int argc, char **argv) {
    std::map<std::string, functor<int(int,int)>> maps = { {"+", add} };
    maps.insert({ "%", [](int i, int j)->int { return i * j; } }  );
    auto temp = maps["%"](5,6);
    std::cout << temp << std::endl;
 }

Live Example