Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <type_traits>
7 :
8 : namespace tt {
9 : /// @{
10 : /*!
11 : * \ingroup TypeTraitsGroup
12 : * \brief Check if `T` is copy constructible
13 : *
14 : * The STL `std::is_copy_constructible` does not work as expected with some
15 : * types, such as `std::unordered_map`. This is because
16 : * `std::is_copy_constructible` only checks that the copy construction call is
17 : * well-formed, not that it could actually be done in practice. To get around
18 : * this for containers we check that `T::value_type` is also copy constructible.
19 : */
20 : template <typename T, typename = void>
21 1 : struct can_be_copy_constructed : std::is_copy_constructible<T> {};
22 :
23 : /// \cond
24 : template <typename T>
25 : struct can_be_copy_constructed<T, std::void_t<typename T::value_type>>
26 : : std::bool_constant<std::is_copy_constructible_v<T> and
27 : std::is_copy_constructible_v<typename T::value_type>> {
28 : };
29 : /// \endcond
30 :
31 : template <typename T>
32 0 : constexpr bool can_be_copy_constructed_v = can_be_copy_constructed<T>::value;
33 : /// @}
34 : } // namespace tt
|