Chromium Code Reviews| Index: base/type_traits.h |
| diff --git a/base/type_traits.h b/base/type_traits.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4e12884ef26d81671abefb1964ceb5423fedc569 |
| --- /dev/null |
| +++ b/base/type_traits.h |
| @@ -0,0 +1,76 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
|
jdoerrie
2017/06/20 23:51:09
base/template_util.h (https://codesearch.chromium.
dyaroshev
2017/06/22 10:41:43
Done - merged it here. Also replaced local impleme
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef BASE_TYPE_TRAITS_H_ |
| +#define BASE_TYPE_TRAITS_H_ |
| + |
| +#include <type_traits> |
| + |
| +namespace base { |
| + |
| +// C++14 --------------------------------------------------------------------- |
| +// These can be replaced with the ones from the standard once we have C++14. |
| + |
| +// std::enable_if_t: http://en.cppreference.com/w/cpp/types/enable_if |
| +template <bool condition, typename T = void> |
| +using enable_if_t = typename std::enable_if<condition, T>::type; |
| + |
| +// std::conditional_t: http://en.cppreference.com/w/cpp/types/conditional |
| +template <bool condition, typename T, typename U> |
| +using conditional_t = typename std::conditional<condition, T, U>::type; |
| + |
| +// C++17 ---------------------------------------------------------------------- |
| +// These can be replaced with the ones from the standard once we have C++17. |
| + |
| +// std::void_t: http://en.cppreference.com/w/cpp/types/void_t |
| +// Needed for the detection idiom. |
| +template <typename...> |
| +using void_t = void; |
| + |
| +// std::nonesuch: http://en.cppreference.com/w/cpp/experimental/nonesuch |
| +// Needed for the detection idiom. |
| +struct nonesuch { |
| + nonesuch() = delete; |
| + ~nonesuch() = delete; |
| + nonesuch(nonesuch const&) = delete; |
| + void operator=(nonesuch const&) = delete; |
| +}; |
| + |
| +// Implementation of the detection idiom from cppreference: |
| +// http://en.cppreference.com/w/cpp/experimental/is_detected |
| +namespace internal { |
| + |
| +template <typename Default, |
| + typename AlwaysVoid, |
| + template <typename...> class Op, |
| + typename... Args> |
| +struct detector { |
| + using value_t = std::false_type; |
| + using type = Default; |
| +}; |
| + |
| +template <typename Default, template <typename...> class Op, typename... Args> |
| +struct detector<Default, void_t<Op<Args...>>, Op, Args...> { |
| + using value_t = std::true_type; |
| + using type = Op<Args...>; |
| +}; |
| + |
| +} // namespace internal |
| + |
| +// std::is_detected: http://en.cppreference.com/w/cpp/experimental/is_detected |
| +template <template <class...> class Op, typename... Args> |
| +using is_detected = |
| + typename internal::detector<nonesuch, void, Op, Args...>::value_t; |
| + |
| +// std::is_detected_v, implemented as a constexpr function instead of a variable |
| +// template, since we don't have those. |
| +// http://en.cppreference.com/w/cpp/experimental/is_detected |
| +template <template <typename...> class Op, typename... Args> |
| +constexpr bool is_detected_c() { |
| + return is_detected<Op, Args...>::value; |
| +} |
| + |
| +} // namespace base |
| + |
| +#endif // BASE_TYPE_TRAITS_H_ |