lambda在类构造函数中使用时不会隐式转换
Lambdas dont implicity convert when using in class constructors
我正试图使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> 相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- enable_if转换构造函数(静态强制转换,is_base_of)
- 为什么我需要在转换构造函数上引用 this->?
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 为什么不对转换构造函数进行隐式强制转换?
- 转换构造函数和运算符都存在且涉及显式性时的行为
- C++ 03 类模板 这是转换构造函数还是转换运算符?以及如何声明解决此问题的方法
- 使用完美转发的模板转换构造函数
- 转换构造函数的参数可以隐式转换吗?
- std::变量转换构造函数行为
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 为什么不调用模板类中的转换构造函数?
- 转换构造函数的隐式参数
- 转换构造函数:您如何解释C 中给定不同参数的函数
- C++变体:为什么转换构造函数需要大小.(类型)为非零
- C++变体用bool转换构造函数
- 在重载解析期间调用转换运算符,而不是在 c++17 中转换构造函数
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 如何将转换构造函数与指针一起使用?
- 为什么在调用隐式类型转换构造函数之后直接是驱动器