/*! @file Forward declares `boost::hana::make`. @copyright Louis Dionne 2013-2017 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_HANA_FWD_CORE_MAKE_HPP #define BOOST_HANA_FWD_CORE_MAKE_HPP #include BOOST_HANA_NAMESPACE_BEGIN //! @ingroup group-core //! Create an object of the given tag with the given arguments. //! //! This function serves the same purpose as constructors in usual C++. //! However, instead of creating an object of a specific C++ type, it //! creates an object of a specific tag, regardless of the C++ type //! of that object. //! //! This function is actually a variable template, so `make` can be //! passed around as a function object creating an object of tag `T`. //! Also, it uses tag-dispatching so this is how it should be customized //! for user-defined tags. //! //! Finally, the default implementation of `make` is equivalent to calling //! the constructor of the given tag with the corresponding arguments. //! In other words, by default, //! @code //! make(args...) == T(args...) //! @endcode //! //! Note that the arguments are perfectly forwarded and the form of //! construction which is used is exactly as documented, i.e. `T(args...)`. //! However, if `T(args...)` is not a valid expression, a compilation //! error is triggered. This default behavior is useful because it makes //! foreign C++ types that have no notion of tag constructible with `make` //! out-of-the-box, since their tag is exactly themselves. //! //! //! Example //! ------- //! @include example/core/make.cpp #ifdef BOOST_HANA_DOXYGEN_INVOKED template constexpr auto make = [](auto&& ...x) -> decltype(auto) { return tag-dispatched; }; #else template struct make_impl; template struct make_t { template constexpr decltype(auto) operator()(X&& ...x) const { return make_impl::apply(static_cast(x)...); } }; template constexpr make_t make{}; #endif BOOST_HANA_NAMESPACE_END #endif // !BOOST_HANA_FWD_CORE_MAKE_HPP