Tag: std function

std :: function存储指针可以指向数据成员吗?

从cppreference ,我发现: 类模板std :: function是一个通用的多态函数包装器。 std :: function的实例可以存储,复制和调用任何Callable目标函数,lambdaexpression式,绑定expression式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针 。 我不明白为什么一个std::function应该能够存储这样一个指针,我从来没有听说过这个function。 是真的有可能,我错过了什么,或者这是文档中的错误? 在这种情况下, operator()应该如何operator() ? 从文档 : 用参数args调用存储的可调用函数目标。 无论如何,这里没有存储可调用函数的目标。 我错了吗? 说实话,我甚至不知道这个函数的正确语法,否则我会写一个例子来testing它。 如何使用以下模板来定义数据成员的指针? template< class R, class… Args > class function<R(Args…)>

我应该复制一个std ::函数,或者我总是可以参考它吗?

在我的C ++应用程序(使用Visual Studio 2010)中,我需要存储一个std ::函数,如下所示: class MyClass { public: typedef std::function<int(int)> MyFunction; MyClass (Myfunction &myFunction); private: MyFunction m_myFunction; // Should I use this one? MyFunction &m_myFunction; // Or should I use this one? }; 正如你所看到的,我在构造函数中添加了函数参数作为参考。 但是,将函数存储在我的类中的最佳方法是什么? 我可以存储函数作为参考,因为std :: function只是一个函数指针,并保证函数的“可执行代码”保留在内存中? 如果lambda传递并且调用者返回,是否必须创build副本? 我的直觉告诉我们,存储一个引用(甚至是一个const引用)是安全的。 我希望编译器在编译时为lambda生成代码,并在应用程序运行时将此可执行代码保存在“虚拟”内存中。 因此,可执行代码永远不会被“删除”,我可以安全地存储对它的引用。 但这是真的吗?

如何在C ++ 11中正确地检查std :: function是否为空?

我想知道如何正确检查一个std::function是否为空。 考虑这个例子: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { … eventFunc(42); } }; 这段代码在MSVC中编译得很好,但是如果我调用doSomething()而不初始化eventFunc ,代码显然会崩溃。 这是预期的,但我想知道什么是eventFunc的价值? debugging器说'empty' 。 所以我解决了这个简单的if语句: void doSomething() { … if (eventFunc) { eventFunc(42); } } 这工作,但我仍然想知道什么是非初始化的std::function ? 我想写if (eventFunc != nullptr)但std::function (显然)不是一个指针。 为什么纯粹的作品? 它背后的魔法是什么? 而且,如何检查它是正确的方法?

C ++ 11 std :: set lambda比较函数

我想用自定义比较函数创build一个std::set 。 我可以将它定义为一个带有operator()的类,但我希望能够定义一个lambda函数,因此我决定在类的构造函数的初始化列表中定义lambda函数,该类的std::set成员。 但是我不能得到lambda的types。 在我继续之前,这里是一个例子: class Foo { private: std::set<int, /*???*/> numbers; public: Foo () : numbers ([](int x, int y) { return x < y; }) { } }; 我search后发现两个解决scheme:一个,使用std::function 。 只要设置比较函数types为std::function<bool (int, int)>并像我一样传递lambda。 第二个解决scheme是写一个make_set函数,就像std::make_pair 。 解决scheme1: class Foo { private: std::set<int, std::function<bool (int, int)> numbers; public: Foo () : numbers ([](int x, int […]

std :: function vs模板

感谢C ++ 11,我们收到了函数包装器的std::function系列。 不幸的是,我一直听到这些新增加的坏消息。 最受欢迎的是它们非常缓慢。 我testing了它,他们真的与模板比较吸。 #include <iostream> #include <functional> #include <string> #include <chrono> template <typename F> float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; } float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; } int main() { using namespace std::chrono; const auto tp1 = system_clock::now(); for (int i = 0; […]

使用`std :: function <void(…)>`来调用非void函数

前一段时间我使用std::function非常像这样: std::function<void(int)> func = [](int i) -> int { return i; }; 基本上,我这样做是因为我想在std::function存储不同的函数对象,但我不想限制这些函数的返回types。 既然这似乎有效,我就跟着去了。 但我不相信这是安全的使用,我一直没能find任何文件。 有谁知道这个用法是否合法? 或者更一般地说,可以安全地分配给std::function的对象的规则是什么? 编辑 澄清,我关心的问题是lambda函数返回一个int ,而func声明返回types为void 。 我不确定这是否行,尤其是一旦调用func() 。

是不是types的std :: function部分的模板参数(签名)?

鉴于以下代码,歧义背后的原因是什么? 我可以规避吗?还是我必须保持(烦人的)明确的演员? #include <functional> using namespace std; int a(const function<int ()>& f) { return f(); } int a(const function<int (int)>& f) { return f(0); } int x() { return 22; } int y(int) { return 44; } int main() { a(x); // Call is ambiguous. a(y); // Call is ambiguous. a((function<int ()>)x); // Works. a((function<int […]