Questions tagged «std-function»

7
std :: function vs template
感谢C ++ 11,我们获得了std::function函子包装器系列。不幸的是,我一直只听到关于这些新功能的坏消息。最受欢迎的是,它们运行缓慢。我测试了一下,与模板相比,它们确实很烂。 #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 …


3
如何正确检查std :: function在C ++ 11中是否为空?
我想知道如何正确检查an 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什么?调试器说'empty'。所以我用简单的if语句解决了这个问题: void doSomething() { ... if (eventFunc) { eventFunc(42); } } 这有效,但我仍然想知道未初始化的值是std::function什么?我想写,if (eventFunc != nullptr)但是std::function(显然)不是指针。 为什么纯如果有效?它背后的魔力是什么?而且,这是检查方法的正确方法吗?

6
C ++ 11 std :: set lambda比较函数
我想std::set用自定义比较功能创建一个。我可以使用来将其定义为类operator(),但是我想享受在其中使用lambda的能力,因此我决定在具有std::set作为成员的类的构造函数的初始化列表中定义lambda函数。但是我无法获得lambda的类型。在继续之前,这里有一个例子: class Foo { private: std::set<int, /*???*/> numbers; public: Foo () : numbers ([](int x, int y) { return x < y; }) { } }; 搜索后,我发现了两种解决方案:一种是使用std::function。只需将设置比较函数类型设置为be,std::function<bool (int, int)>然后像我一样完全传递lambda即可。第二种解决方案是编写一个make_set函数,例如std::make_pair。 解决方案1: class Foo { private: std::set<int, std::function<bool (int, int)> numbers; public: Foo () : numbers ([](int x, int y) { return …

4
为什么std :: function不参与重载解析?
我知道以下代码不会编译。 void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } std::function正如我在另一篇文章中所读到的,因为据说不考虑重载解决方案。 我不完全理解强制这种解决方案的技术局限性。 我阅读了有关cppreference 的翻译和模板的阶段,但是我无法想到找不到反例的任何理由。向半熟练的人解释(对于C ++来说仍然是新手),什么以及在什么翻译阶段使以上内容无法编译?

1
std :: function const正确性
假设我有一个像这样的可调用类型: struct mutable_callable { int my_mutable = 0; int operator()() { // Not const return my_mutable++; } }; 请注意,它mutable_callable具有一个operator()用于修改成员变量的非常量。 现在假设我创建了一个std::function我的类型之外的代码: std::function<int()> foo = mutable_callable{}; 现在我可以这样做: void invoke(std::function<int()> const& z) { z(); } int main() { invoke(foo); // foo changed.....oops } 现在,据我所知,std::functions operator()的信息const如下:https : //en.cppreference.com/w/cpp/utility/functional/function/operator() 所以我的直觉是您不应该这样做..... 但随后查看:https : //en.cppreference.com/w/cpp/utility/functional/function/function 这似乎对可调用类型是否具有常量没有任何限制operator()…… 所以我的问题是:我认为这std::function<int()> …

2
尽管明确说明了返回类型,但对lambda的调用还是模棱两可的
鉴于lambda的类型是可确定的(可强制转换为a std::function(请纠正我,如果我错了,请纠正我)),重载函数应该同时使用两个函子。已定义?([&]() -> Type {}) 请注意,对于我当前的解决方案,我需要按引用捕获,这就是为什么代码包含其逻辑的原因。 以下示例描述了该问题: #include <iostream> #include <string> #include <functional> void do_some(std::function<void(int)> thing) { thing(5); } void do_some(std::function<bool(int)> thing) { if (thing(10)) { std::cout << "it's true!" << std::endl; } } int main() { int local_to_be_modified = 0; do_some( [&](int in) { local_to_be_modified = in; std::cout << …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.