lambda在类构造函数中使用时不会隐式转换

Lambdas dont implicity convert when using in class constructors

本文关键字:转换 构造函数 lambda      更新时间:2023-10-16

我正试图使std::function的简单实现

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

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;
 }
<<p> 生活例子/strong>