在 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;
}
我正在尝试简单地实现 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;
}