// // 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 "boost/di/extension/bindings/constructor_bindings.hpp" #include #include #include #include namespace di = boost::di; //<- struct interface { virtual ~interface() noexcept = default; virtual void dummy() = 0; }; struct implementation : interface { void dummy() override {} }; //-> /*<>*/ struct ctor { ctor(int i, std::string s, std::unique_ptr impl) { assert(i == 2); assert(s == "hello"); assert(dynamic_cast(impl.get())); } }; /*<>*/ struct ambiguous_ctor { ambiguous_ctor(int i, std::string s) { assert(i == 2); assert(s == "hello"); } ambiguous_ctor(std::string s, int i) { assert(s == "hello"); assert(i == 2); } }; /*<>*/ struct variadic { template explicit variadic(Ts&&... args) { // has to be explicit assert(sizeof...(Ts) == 3); std::tuple ts{std::forward(args)...}; assert(std::get<0>(ts) == 2); assert(std::get<1>(ts) == "hello"); assert(dynamic_cast(std::get<2>(ts).get())); } }; int main() { // clang-format off /*<>*/ auto injector = di::make_injector( di::bind().to(di::extension::constructor>()) , di::bind().to(di::extension::constructor()) , di::bind().to(di::extension::constructor>()) /*<>*/ , di::bind().to() , di::bind().to(2), di::bind().to("hello") ); // clang-format on /*<>*/ injector.create(); injector.create(); injector.create(); }