คำถามติดแท็ก std-function

7
std :: function vs template
ขอบคุณ C ++ 11 ที่เราได้รับการstd::functionห่อหุ้มของ functor น่าเสียดายที่ฉันได้ยิน แต่เรื่องเลวร้ายเกี่ยวกับการเพิ่มสิ่งใหม่เหล่านี้เท่านั้น ความนิยมมากที่สุดคือพวกเขาช้าอย่างน่ากลัว ฉันทดสอบมันและพวกเขาดูดอย่างแท้จริงเมื่อเปรียบเทียบกับแม่แบบ #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 …

4
std :: function และ std :: bind: คืออะไรและควรใช้เมื่อใด
ฉันรู้ว่าสิ่ง functors และเมื่อจะใช้พวกเขาด้วยstdอัลกอริทึม แต่ฉันยังไม่เข้าใจสิ่งที่ Stroustrup กล่าวเกี่ยวกับพวกเขาในC ++ 11 คำถามที่พบบ่อย ทุกคนสามารถอธิบายสิ่งที่std::bindและstd::functionเป็นเมื่อพวกเขาควรจะนำมาใช้และให้ตัวอย่างสำหรับมือใหม่?

3
จะตรวจสอบได้อย่างไรว่า std :: function ว่างใน C ++ 11 หรือไม่?
ฉันสงสัยว่าจะตรวจสอบอย่างไรว่า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(ชัด ๆ …

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 :: ฟังก์ชั่น const ความถูกต้อง
สมมติว่าฉันมีประเภท callable ดังนี้ 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 () ดังนั้นความรู้สึกของฉันคือคุณไม่ควรทำสิ่งนี้ ..... แต่จากนั้นดูที่: …

2
การโทรไปแลมบ์ดานั้นไม่ชัดเจนแม้จะระบุประเภทการคืนอย่างชัดเจน
ฟังก์ชั่นโอเวอร์โหลดควรใช้ทั้งฟังก์ชั่นในเนื่องจากประเภทของแลมบ์ดานั้นสามารถนำกลับมาใช้ใหม่ได้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 …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.