При розробці програм на C++, особливо великих проєктів, оптимізація коду та його ефективне використання є критично важливими завданнями. Одним з популярних методів організації коду є використання лямбда-функцій для створення зручного та гнучкого інтерфейсу. У цій статті ми розглянемо конкретну задачу оптимізації використання лямбда-функцій у векторі класу C++.
Почнемо з постановки проблеми. У нашому випадку ми маємо клас test_harness
, який включає в себе вектор all_tests
лямбда-функцій. Мета полягає в тому, щоб ці лямбда-функції залишалися дійсними протягом усього життєвого циклу об’єкту test_harness
. Однак, при виклику методу run_all()
відбувається падіння програми через втрату лямбда-функцій з вектора.
Вирішення цієї проблеми полягає у правильному керуванні областями видимості та життєвим циклом лямбда-функцій. Одним з можливих рішень є створення копій лямбда-функцій, які будуть зберігатися вектором. Для цього ми можемо використовувати функцію std::function
разом із std::bind
для створення копій лямбда-функцій, які будуть збережені в векторі.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
```cpp #include <string> #include <functional> #include <vector> #include <iostream> class test_pass { public: std::string const name; test_pass(std::string const &name, std::function<bool()> run) : name(name), run_lambda(run) {} bool operator()(); private: std::function<bool()> run_lambda; bool success; }; class test_harness { public: test_harness(); bool run_all(); bool init_test(); private: std::vector<std::function<bool()>> all_tests; }; bool test_pass::operator()() { return (success = run_lambda()); } test_harness::test_harness() { std::function<bool()> run1 = std::bind(&test_harness::init_test, this); all_tests.push_back(run1); } bool test_harness::init_test() { return true; } bool test_harness::run_all() { int num_passed = 0; for (auto &test : all_tests) { if (test()) { std::cout << "Test passed." << std::endl; num_passed++; } else { std::cout << "Test FAILED." << std::endl; } } std::cout << num_passed << " tests passed, " << (all_tests.size() - num_passed) << " tests failed." << std::endl; return (num_passed == all_tests.size()); } int main() { test_harness tests; tests.run_all(); return 0; } |
В даному прикладі ми змінили тип вектора all_tests
на std::vector
, щоб зберігати копії лямбда-функцій. При додаванні нової лямбда-функції до вектора ми використовуємо std::bind
для збереження копії лямбда-функції разом з необхідними аргументами.
Використання цього підходу дозволяє нам зберегти лямбда-функції дійсними протягом усього життєвого циклу об’єкту test_harness
, запобігаючи проблемам з втратою даних через вихід із області видимості.
У цій статті ми розглянули один із способів оптимізації використання лямбда-функцій у векторі класу C++. Якщо ви стикаєтесь із подібними проблемами у своєму коді, спробуйте використати вищезазначений підхід для забезпечення стабільної та ефективної роботи вашої програми.
`