将函数对象传递给 std::function
Passing a function object to std::function
我在使用函数对象创建 std::function 实例时遇到了一点麻烦。(我的环境是使用 Visual Studio 2015 的 C++ 11。
首先,我有一个在函数对象的参数列表中使用的类。这是一个简化版本,说明了要点。
class X
{
public:
void zz(int a) const
{
std::cout << "X:zz, a = " << a << "." << std::endl;
}
};
然后这里是函数对象,它在其 operator(( 方法中使用 X。
class Y
{
public:
void operator()(const X& x)
{
x.zz(17);
}
};
现在,我想将 Y 的一个实例包装在一个 std::function 中。函数的类型是 void(const X&(,这是一个将 const 引用 X 作为参数的 void 函数。方法 Y:operator(( 具有此签名。
void test_it
{
X my_x;
Y my_y;
std::function<void(const X&)> f1(my_y);
f1(my_x); // OK
std::function<void(const X&)> f2(Y());
f2(my_x); // cannot convert argument 1 from X to Y
std::function<void(const X&)> f3(Y);
f3(my_x); // cannot convert argument 1 from X to Y
std::function<void(const X&)> f4(Y{});
f4(my_x); // OK
}
第一个示例 f1 创建 Y、my_y 的实例,并使用此实例创建 f1。这工作正常。(Y 的内容被移动到 std::function 构造函数中的 std::function 中。
第二次尝试 f2 在 f2 的构造函数中构造 Y 的实例。当我尝试使用 f2(my_x( 调用它时,编译器抱怨它无法将参数 1 (my_x( 从 X 转换为 Y。
第三次尝试,f3,我只是在 f3 的 std::function 构造中命名函数对象类,以与 f2 相同的方式失败。
最后,f4 工作。在这个中,我使用一个空的初始值设定项列表构造函数对象 Y。
也许有一个简单的解释,但我不明白为什么其中两个用例不能编译。特别是使用 Y(( 的 f2 和使用 Y{} 的 f4,对我来说似乎几乎相同。
对于第二种情况,表达式Y()
尝试定义一个返回Y
且不带参数的函数,并将该函数作为参数传递。这被称为最令人烦恼的解析。
对于第三种情况,不能提供类型而不是函数参数。
将默认构造的Y
实例传递给std::function
的正确方法是第 4 种情况。
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将 lambda 表达式传递给 std::function in C++
- 模板类的部分模板专用化,如 std::function
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 从 std::function in C++ 访问模板化 lambda
- 什么是 std::function::argument_type 的替代品?
- C++派生类重载函数(带有 std::function 参数)不可见
- 如何在 qi 符号表中使用 std::function
- 将 std::function 与模板一起使用
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 我需要在 std::function 上使用 unique_ptr 吗?
- 如何将函数指针从 std::function 传递到 Linux 克隆?