// // Copyright (c) 2012-2020 Kris Jusiak (kris at jusiak dot net) // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // //<- #include #include #include #include namespace di = boost::di; struct i1 { virtual ~i1() noexcept = default; virtual void dummy1() = 0; }; struct i2 { virtual ~i2() noexcept = default; virtual void dummy2() = 0; }; struct impl1 : i1 { void dummy1() override {} }; struct impl2 : i2 { void dummy2() override {} }; struct impl : i1, i2 { void dummy1() override {} void dummy2() override {} }; //-> int main() { auto l = 42l; auto b = false; // clang-format off auto injector = di::make_injector( di::bind().to(0) , di::bind().to(42)[di::override] , di::bind().to(std::make_shared()) , di::bind().to(l) , di::bind().to([] { return 87; }) , di::bind().to([&](const auto& injector) -> std::shared_ptr { return b ? injector.template create>() : nullptr; }) ); // clang-format on assert(42 == injector.create()); assert(injector.create>() == injector.create>()); assert(l == injector.create()); assert(&l == &injector.create()); assert(87 == injector.create()); { auto object = injector.create>(); assert(nullptr == object); } { b = true; auto object = injector.create>(); assert(dynamic_cast(object.get())); } }