Added file of type trait aliases for traits we use
[ci skip] These are (semi-verbatim) clones of the trait aliases found in C++14 and C++17.
This commit is contained in:
parent
f497b02ad9
commit
3fce91a8fa
1 changed files with 91 additions and 0 deletions
91
src/utils/type_trait_aliases.hpp
Normal file
91
src/utils/type_trait_aliases.hpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
Copyright (C) 2017 by the Battle for Wesnoth Project http://www.wesnoth.org/
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY.
|
||||
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "global.hpp"
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace utils
|
||||
{
|
||||
//
|
||||
// These aliases are available in C++14. Forward to their declarations
|
||||
// if building with that.
|
||||
//
|
||||
#ifdef HAVE_CXX14
|
||||
|
||||
using std::add_const_t;
|
||||
using std::conditional_t;
|
||||
using std::enable_if_t;
|
||||
using std::remove_const_t;
|
||||
using std::remove_reference_t;
|
||||
using std::remove_pointer_t;
|
||||
|
||||
#else
|
||||
|
||||
// add_const
|
||||
template<typename T>
|
||||
using add_const_t = typename std::add_const<T>::type;
|
||||
|
||||
// conditional
|
||||
template<bool B, typename T, typename F>
|
||||
using conditional_t = typename std::conditional<B, T, F>::type;
|
||||
|
||||
// enable_if
|
||||
template<bool B, typename T = void>
|
||||
using enable_if_t = typename std::enable_if<B, T>::type;
|
||||
|
||||
// remove_const
|
||||
template<typename T>
|
||||
using remove_const_t = typename std::remove_const<T>::type;
|
||||
|
||||
// remove_reference
|
||||
template<typename T>
|
||||
using remove_reference_t = typename std::remove_reference<T>::type;
|
||||
|
||||
// remove_pointer
|
||||
template<typename T>
|
||||
using remove_pointer_t = typename std::remove_pointer<T>::type;
|
||||
|
||||
#endif // HAVE_CXX14
|
||||
|
||||
//
|
||||
// These aliases are part of the standard starting with C++17.
|
||||
// Since we're not even near supporting that, we define them directly.
|
||||
// They can be added to a conditional block once we have a define for C++17.
|
||||
//
|
||||
|
||||
// MSVC 2013 doesn't support constexpr :(
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
|
||||
// is_base_of
|
||||
template<typename Base, typename Derived>
|
||||
static const bool is_base_of_v = std::is_base_of<Base, Derived>::value;
|
||||
|
||||
// is_same
|
||||
template<typename T, typename U>
|
||||
static const bool is_same_v = std::is_same<T, U>::value;
|
||||
|
||||
#else
|
||||
|
||||
// is_base_of
|
||||
template<typename Base, typename Derived>
|
||||
inline constexpr bool is_base_of_v = std::is_base_of<Base, Derived>::value;
|
||||
|
||||
// is_same
|
||||
template<typename T, typename U>
|
||||
inline constexpr bool is_same_v = std::is_same<T, U>::value;
|
||||
|
||||
#endif
|
||||
}
|
Loading…
Add table
Reference in a new issue